为什么NodeJS在大数量增加时不准确?

时间:2018-01-17 07:02:43

标签: javascript php node.js

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

这是PHP代码:

Time Taken: 15
i: 1000000001
j: 500000000500000000

返回了以下输出:

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);

这是NodeJS代码:

Time Taken: 1 
i: 1000000001
j: 500000000067109000

返回了以下输出:

j

为什么NodeJS中conda create --name intelpy --channel intel --override-channels intelpython 变量错误?

编辑:

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

2 个答案:

答案 0 :(得分:3)

由于你改变了问题的意图,我觉得要重新打开它。

在JavaScript中,没有整数或浮点数,只有Number,使用IEEE 754-2008 64位(双精度)格式表示。这种格式的一个特点是所有&#34;整数&#34; -9007199254740991和9007199254740991之间可以准确表示。超出此范围的数字是近似的。简单的例子:

> 9007199254740993
< 9007199254740992

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

在PHP中,您有integers and floats。但是:

  • 整数数据类型的大小在所有平台上都不相同
    • PHP x64使用8字节整数*(-9223372036854775808 ... 9223372036854775807)
    • PHP x86使用4字节整数(-2147483648 ... 2147483647)
    • PHP 似乎使用IEEE 754-2008 64位浮点数,与JavaScript相同
  • PHP在溢出的情况下将变量的数据类型从整数更改为float

在PHP x64上运行时,您的示例程序的最终$j = int(500000000500000000)小于PHP_INT_MAX的值,因此不会发生转换为浮动(并且精度不准确)。

相同的代码,当在PHP x86上运行时,一旦变量大于PHP_INT_MAX,就将变量转换为浮点值,因此$j = float(5.0000000006710899E+17)结束**

*虽然不在Windows上 **您需要将precision设置为最大值

答案 1 :(得分:2)

javascript号码。MAX_SAFE_INTEGER9007199254740991