我在PHP和NodeJS中执行了相同的添加。PHP正确计算了多达10亿次迭代,但NodeJS仅正确计算了多达1亿次迭代。
这是PHP代码:
<?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";
?>返回以下输出:
Time Taken: 15
i: 1000000001
j: 500000000500000000这是NodeJS代码:
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);返回以下输出:
Time Taken: 1
i: 1000000001
j: 500000000067109000为什么j变量在NodeJS中出错?
编辑:
正如@SalmanA (并得到我的证实)所指出的,我还想进一步问,为什么不同处理器上的Javascript的最大整数限制保持不变,但是PHP的变化呢?
发布于 2018-01-17 10:45:15
既然你改变了问题的意图,我就想重新打开它。
在JavaScript中,没有整数或浮点数,只有Number,使用IEEE754-200864位(双精度)格式表示.这种格式的一个特点是可以准确地表示−9007199254740991和9007199254740991之间的所有“整数”。超出此范围的数字是近似的。简单的例子:
> 9007199254740993
< 9007199254740992Node.js代码产生的值大于Number.MAX_SAFE_INTEGER,这就是为什么结果是近似的,而不是精确的。
在PHP中,您有整数和浮点数。然而:
当您的示例程序在PHP上运行时,其结果是小于x64值的$j = int(500000000500000000),因此不会发生将其转换为浮点(以及丢失准确性)的情况。
同样的代码,在PHP上运行时,当变量大于x86时,它会将其转换为浮点值,因此将以$j = float(5.0000000006710899E+17)**结束。
*但在Windows上没有
**需要将precision设置为最大值
发布于 2018-01-17 07:05:16
MAX_SAFE_INTEGER是9007199254740991
https://stackoverflow.com/questions/48295347
复制相似问题