首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NodeJS是不准确的大数目的加法?

为什么NodeJS是不准确的大数目的加法?
EN

Stack Overflow用户
提问于 2018-01-17 07:02:43
回答 2查看 263关注 0票数 4

我在PHP和NodeJS中执行了相同的添加。PHP正确计算了多达10亿次迭代,但NodeJS仅正确计算了多达1亿次迭代。

这是PHP代码:

代码语言:javascript
复制
<?php
$start_time = time();
$j = 0;
for ($i = 0; $i <= 1000000000; $i++) {
    $j += $i;
}
$end_time = time();
echo "Time Taken: " . ($end_time - $start_time);
echo "\n";
echo "i: " . $i;
echo "\n";
echo "j: " . $j;
echo "\n";
?>

返回以下输出:

代码语言:javascript
复制
Time Taken: 15
i: 1000000001
j: 500000000500000000

这是NodeJS代码:

代码语言:javascript
复制
var epoch = require('epoch.js');
var start_time = epoch().format('ss');
var i;
var j = 0;
for (i = 0; i <= 1000000000; i++) {
    j += i;
}
var end_time = epoch().format('ss');
var time_taken = end_time - start_time;
console.log("Time Taken: " + time_taken + " \ni: " + i + "\nj: " + j);

返回以下输出:

代码语言:javascript
复制
Time Taken: 1 
i: 1000000001
j: 500000000067109000

为什么j变量在NodeJS中出错?

编辑:

正如@SalmanA (并得到我的证实)所指出的,我还想进一步问,为什么不同处理器上的Javascript的最大整数限制保持不变,但是PHP的变化呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-17 10:45:15

既然你改变了问题的意图,我就想重新打开它。

在JavaScript中,没有整数或浮点数,只有Number,使用IEEE754-200864位(双精度)格式表示.这种格式的一个特点是可以准确地表示−9007199254740991和9007199254740991之间的所有“整数”。超出此范围的数字是近似的。简单的例子:

代码语言:javascript
复制
> 9007199254740993
< 9007199254740992

Node.js代码产生的值大于Number.MAX_SAFE_INTEGER,这就是为什么结果是近似的,而不是精确的。

在PHP中,您有整数和浮点数。然而:

  • 在所有平台( )中,整数数据类型的大小并不相同。
    • PHP x64使用8字节整数* (-9223372036854775808 . 9223372036854775807)
    • PHP x86使用4字节整数(-2147483648 . 2147483647)
    • PHP似乎使用IEEE 754-2008 64位浮点数,与JavaScript相同。

  • PHP在溢出时将变量的数据类型从整数更改为浮动

当您的示例程序在PHP上运行时,其结果是小于x64值的$j = int(500000000500000000),因此不会发生将其转换为浮点(以及丢失准确性)的情况。

同样的代码,在PHP上运行时,当变量大于x86时,它会将其转换为浮点值,因此将以$j = float(5.0000000006710899E+17)**结束。

*但在Windows上没有

**需要将precision设置为最大值

票数 3
EN

Stack Overflow用户

发布于 2018-01-17 07:05:16

MAX_SAFE_INTEGER9007199254740991

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48295347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档