为啥这个数字会增加一? [复制]

Posted

技术标签:

【中文标题】为啥这个数字会增加一? [复制]【英文标题】:Why does this number get increased by one? [duplicate]为什么这个数字会增加一? [复制] 【发布时间】:2017-04-13 13:16:53 【问题描述】:

console.log(10209761399365907);

为什么这段代码会输出一个大一的数字(10209761399365908 而不是 10209761399365907)?

这只发生在这个特定的号码上。例如,对于 10155071933693662,我得到了正确的值(10155071933693662)。

我需要了解有关该特定号码的一些信息吗?我想出的唯一解决方法是将值作为字符串传递。

【问题讨论】:

嗯,这听起来很奇怪。如果您尝试在开发控制台中粘贴数字,也会发生这种情况。可能跟这个数字太大有关? 这是一个 Facebook ID,我将它存储为 C# 中的 LONG 相关(甚至可能重复):What is javascript's highest integer value that a Number can go to without losing precision? @Gothdo 我认为您对这个问题所做的编辑不是一个好主意。具体来说,您删除了最初发布的 html 标记以及在元素的事件处理程序属性值中显式使用字符串的相当重要的一点。 @JanDvorak 我不介意将其作为副本关闭,但覆盖问题的原始内容意味着没有人会遇到这个问题,并且链接的副本是基于执行搜索的偶然结果那个内容。 【参考方案1】:

您的数值太大,无法准确表示为 64 位浮点数。你得到的值是一个近似值。 JavaScript 原生只有 64 位浮点数; do 适合 C 或 C++ 中的 long 的值可能太大而无法准确表示,因为 64 位中的一些用于浮点表示中的指数。 (权衡是,与使用简单整数表示相比,使用浮点数可以使用 更大或更小数值幅度的值的近似值。)

如果将值作为数字操作并不重要,则将其设为字符串:

console.log("10209761399365907");

或者正如我对最初出现的问题所建议的那样:

<input type="button" value="Invita" onclick="Invite('@us.FacebookID')" />

“FacebookID”是有问题的大数字。

有一个常量(在较新的 JavaScript 环境中)称为Number.MAX_SAFE_INTEGER。这告诉您可以表示多大的数字,以便准确表示该值;也就是说,64 位浮点尾数将包含整个值的显式位。

更大的偶数 整数可以精确表示,具体取决于在其二进制表示的低端有多少个零位。因此,1152921504606846800 可以精确表示,因为它在二进制表示的低端有 7 位全零。然而,11529215046068468011152921504606846800 出现,因为那个低的1 位无处可去。 (未表示的位假定为零。)

附录:这是所提出问题的(几乎)原始版本,以解释上面可能令人困惑的示例代码:


我遇到了一个非常奇怪的 Javascript 问题。 我有一些来自我的服务器的 id,当我按下按钮时,参数被传递给执行请求的方法。

这是代码:

<script type="text/javascript">
function Invite(id)

    alert(id);

</script>

另一方面,我有:

(CSHTML 语法)

 <input type="button" value="Invita" onclick="Invite(@us.FacebookID)" />

变成了:

<input type="button" value="Invita" onclick="Invite(10209761399365907)">

但是当我点击按钮时……方法接收到的参数增加一!

而且这只发生在一个特定的 ID 上! 例如,使用 10155071933693662 我得到正确的值 (10155071933693662)

我需要了解有关该特定号码的一些信息吗?这一切真的很奇怪,我想出的唯一解决方法是将值作为字符串传递!

【讨论】:

Mate、1020976139936590810209761399365906 返回正确的值。为什么只有10209761399365907 @PraveenKumar 那是因为右边有一些位被丢弃。在浏览器控制台中输入 Number.MAX_SAFE_INTEGER 并将其与问题中的此值进行比较。 @PraveenKumar 这些是偶数。我想知道这些二进制表示中的低位是什么? “大”在这种情况下并不意味着“更大的数字”,而是“更大的位表示”。

以上是关于为啥这个数字会增加一? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在一串数字中每三位加一个逗号,就像1,234,567.01这样有何作用?

为啥在一串数字中每三位加一个逗号,就像1,234,567.01这样有何作用?

为啥 Python 2 允许列表和数字之间的比较? [复制]

为啥 echo $$ 返回一个数字? [复制]

当期望输出 10,000 个数字时,为啥 python 只输出 6 个由 '...' 分隔的数字? [复制]

CSS怎么给数字中间加一横线