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

Zib*_*eah 8 javascript numbers

console.log(10209761399365907);
Run Code Online (Sandbox Code Playgroud)

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

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

关于那个具体的数字,我需要知道些什么吗?我想出的唯一解决方法是将值作为字符串传递.

Poi*_*nty 18

您的数值太大,无法完全表示为64位浮点数.你得到的值是近似值.JavaScript本身只有64位浮点数; 该值适合在一个long被精确地表示在C或C++可能太大,因为有些64个比特被用于在浮点表示的指数.(这种交易是与浮点有可能与近似工作的价值观与很多更大或更小的数值幅度可能比简单的整数表示.)

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

console.log("10209761399365907");
Run Code Online (Sandbox Code Playgroud)

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

<input type="button" value="Invita" onclick="Invite('@us.FacebookID')" />
Run Code Online (Sandbox Code Playgroud)

哪个"FacebookID"是有问题的大数字.

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

可以精确地表示更大的偶数整数,这取决于它们的二进制表示的低端有多少零位.因此,1152921504606846800可以精确地表示,因为它在二进制表示的低端有7位全零.不过,1152921504606846801出来的1152921504606846800,因为在低1比特无处可去.(未表示的位假定为零.)

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


我正面临着Javascript的问题,这很奇怪.我有一些来自我的服务器的ID,当我按下一个按钮时,参数被传递给一个方法来执行请求.

这是代码:

<script type="text/javascript">
function Invite(id)
{
    alert(id);
}
</script>
Run Code Online (Sandbox Code Playgroud)

另一方面,我有:

(CSHTML语法)

 <input type="button" value="Invita" onclick="Invite(@us.FacebookID)" />
Run Code Online (Sandbox Code Playgroud)

那成了:

<input type="button" value="Invita" onclick="Invite(10209761399365907)">
Run Code Online (Sandbox Code Playgroud)

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

来自CODE的警报

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

关于那个具体的数字,我需要知道些什么吗?所有这一切都很奇怪,我想到的唯一解决方法是将值传递给字符串!

  • @PraveenKumar,因为右手边有点掉落.在浏览器控制台中键入"Number.MAX_SAFE_INTEGER",并将其与问题中的此值进行比较. (4认同)
  • @PraveenKumar和那些是偶数.我想知道那些二进制表示中的低位是什么? (4认同)
  • 在这种情况下,"大"并不意味着"更大的数字",而是"更大的位代表". (3认同)