我在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的变化是什么?
答案 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上运行时,您的示例程序的最终$j = int(500000000500000000)
小于PHP_INT_MAX
的值,因此不会发生转换为浮动(并且精度不准确)。
相同的代码,当在PHP x86上运行时,一旦变量大于PHP_INT_MAX
,就将变量转换为浮点值,因此将以$j = float(5.0000000006710899E+17)
结束**
*虽然不在Windows上
**您需要将precision
设置为最大值
答案 1 :(得分:2)
javascript号码。MAX_SAFE_INTEGER
是9007199254740991