Mar*_*amo 2 javascript numbers node.js
就在几天前,当我想将"product_code"作为数字值发送时,我开始编写一个使用巴西服务的包装器,但数量非常高.神奇的数字是5213372036854743040,这是一个很高的价值,但当我收到我的第一个bug告诉我产品现在可供我使用时,我打开一些支持票,但奇怪的是POSTMan效果很好,但在我的应用中使用请求我收到错误消息.
好吧,打开Node.js控制台和Chrome的控制台并输入号码5213372036854743040,返回值仅为5213372036854743000.我的第一个想法是"好吧,也许这个数字是最大数值"但是,x64中的最大整数是9,223,372,036,854,775,807和Number.MAX_VALUE是1.7976931348623157e + 308.
如果我将数字与100相加,则返回值相同,但如果我将该值加倍,则此方法有效.我想也许当我们得到一个超过19个algarisms的数字时,v8只是将值舍入为000结束.
这里有人知道什么或因为这适用于这种行为?
Number.MAX_VALUE是浮点数可以具有的最大值.对于连续的整数,您要检查Number.MAX_SAFE_INTEGER.
Number.MAX_SAFE_INTEGER > 5213372036854743000; //false
Run Code Online (Sandbox Code Playgroud)
或许更简洁:
Number.isSafeInteger(5213372036854743000); //false
Run Code Online (Sandbox Code Playgroud)
请注意这两个Number.MAX_SAFE_INTEGER和Number.isSafeInteger()是在2015年ES新的可能无法在旧版本的节点可用.
关于安全整数的一个很好的解释是在MDN文档中Number.MAX_SAFE_INTEGER:
MAX_SAFE_INTEGER常量的值为9007199254740991.该数字背后的原因是JavaScript使用IEEE 754中指定的双精度浮点格式数,并且只能安全地表示 - (253 - 1)和253 - 1之间的数字.
在这种情况下,安全是指能够准确表示整数并正确比较它们的能力.例如,Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2将评估为true,这在数学上是不正确的.有关更多信息,请参见Number.isSafeInteger().
因为MAX_SAFE_INTEGER是Number的静态属性,所以始终将其用作Number.MAX_SAFE_INTEGER,而不是您创建的Number对象的属性.
由于您使用的是Node.js,因此您可以使用像bignum这样的npm包来解决这个问题.
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |