在Javascript中使用高数值的奇怪行为

在Javascript中使用高数值的奇怪行为,javascript,node.js,numbers,Javascript,Node.js,Numbers,就在几天前,当我想将“product_code”作为一个数字值发送时,我开始编写一个包装器来使用巴西服务,但这个数字非常高。 神奇的数字是52133720763854743040,这是一个很高的值,但当我收到我的第一个错误告诉我该产品现在可供我使用时,我打开了一些支持票证,但奇怪的是邮递员工作得很好,但在我使用Request的应用程序中,我从未收到错误消息 那么,打开Node.js控制台和Chrome的控制台,输入5213372036854743040,返回值仅为5213372036854743

就在几天前,当我想将“product_code”作为一个数字值发送时,我开始编写一个包装器来使用巴西服务,但这个数字非常高。 神奇的数字是52133720763854743040,这是一个很高的值,但当我收到我的第一个错误告诉我该产品现在可供我使用时,我打开了一些支持票证,但奇怪的是邮递员工作得很好,但在我使用Request的应用程序中,我从未收到错误消息

那么,打开Node.js控制台和Chrome的控制台,输入5213372036854743040,返回值仅为5213372036854743000。我的第一个想法是“好吧,也许这个数字是最大的数字值”,但是,x64中的最大整数是9223372036854775807,number.max_值是1.7976931348623157e+308

如果我把这个数字和100相加,返回值是一样的,但是如果我把这个值翻了一倍,这就行了。我想也许当我们得到一个超过19个Algarism的数字时,v8的值刚好接近000


这里有人知道这是什么,或者因为这与这种行为有关?

不幸的是,这就是它的工作原理

请参阅本文->

该格式使用具有隐式整数的有效位写入 值为1的位(特殊基准除外,参见指数编码 下)。分数有效位的52位出现在 内存格式,因此总精度为53位(约 16位十进制数字,53个log10(2)≈ 15.955). 这些部分的布局如下所示 如下:

这意味着您只有16位数字可用于精确计算。64位的其余部分保留给指数

chrome控制台中的示例:

>9999999999999998
999999999999998

100000000000000


在Javascript中处理大整数有一些参考资料。这里有一个->

数字。MAX\u值是一个浮点数可以具有的最大值。对于连续的整数,您需要检查Number.MAX\u SAFE\u INTEGER

Number.MAX_SAFE_INTEGER > 5213372036854743000; //false
或者更简洁地说:

Number.isSafeInteger(5213372036854743000); //false
请注意,
Number.MAX\u SAFE\u INTEGER
Number.isSafeInteger()
在ES 2015中都是新的,在旧版本的节点中可能不可用

关于安全整数的一个很好的解释是:

MAX_SAFE_整数常量的值为9007199254740991。这个数字背后的原因是JavaScript使用IEEE 754中指定的双精度浮点格式数字,并且只能安全地表示介于-(253-1)和253-1之间的数字

在此上下文中,“安全”指的是准确表示整数并正确比较它们的能力。例如,Number.MAX\u SAFE\u INTEGER+1==Number.MAX\u SAFE\u INTEGER+2将计算为true,这在数学上是不正确的。有关更多信息,请参见Number.isSafeInteger()

因为MAX_SAFE_INTEGER是Number的静态属性,所以您总是将其用作Number.MAX_SAFE_INTEGER,而不是您创建的Number对象的属性

因为您使用的是Node.js,所以您可以使用类似的npm包来解决这个问题

Number.isSafeInteger(5213372036854743000); //false