为什么这个数字会增加一个?

时间:2016-11-29 13:54:01

标签: javascript numbers



console.log(10209761399365907);




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

仅在此特定数字上发生这种情况。例如,使用10155071933693662,我得到正确的值(10155071933693662)。

我需要知道有关该特定数字的事情吗?我想出的唯一解决方法是将值作为字符串传递。

1 个答案:

答案 0 :(得分:18)

您的数值太大,无法完全表示为64位浮点数。你得到的值是近似值。 JavaScript本身只有64位浮点数; 适合C或C ++中的long的值可能太大而无法准确表示,因为64位中的一些用于浮点表示中的指数。 (折衷的是,对于浮点数,可以使用 更大或更小的数值幅度的值的近似值,而不是简单的整数表示。)

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

console.log("10209761399365907");

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

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

其中“FacebookID”是有问题的大号。

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

可以精确地表示较大的偶数整数,具体取决于它们的二进制表示的低端有多少个零位。因此,1152921504606846800可以精确表示,因为它在二进制表示的低端有7位全零。但是,1152921504606846801标记为1152921504606846800,因为低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)">

但是当我点击按钮时......方法接收参数的数字由ONE增加!

Alert from CODE

这只发生在一个特定的身份证上! 例如,使用10155071933693662我得到了正确的值(10155071933693662)

我需要知道有关该特定数字的事情吗?所有这一切都很奇怪,我想出的唯一解决方法是将值作为字符串传递!