为什么javascript轮次36028797018963968并且没有明确的指令来更多数字?

时间:2017-04-10 16:26:10

标签: javascript google-chrome firefox rounding opera

我正在创建一个简单的javascript数组,其中包含预先计算的2个值的幂。该数组有大约66个项目,其中每个项目包含一个值,因此它的2的幂是根据它的索引计算的。例如:

var the_array = [
    {name: 'blabla', index: 0, power: 1}, // 2^0
    {name: 'blabla', index: 1, power: 2}, // 2^1
    {name: 'blabla', index: 2, power: 4}, // 2^2
    // ...
    {name: 'blabla', index: 54, power: 18014398509481984}, // 2^54
    {name: 'blabla', index: 55, power: 36028797018963968}, // 2^55
    {name: 'blabla', index: 56, power: 72057594037927936}, // 2^56
    {name: 'blabla', index: 57, power: 144115188075855872}, // 2^57
    {name: 'blabla', index: 58, power: 288230376151711744}, // 2^58
    {name: 'blabla', index: 59, power: 576460752303423488}, // 2^59
    {name: 'blabla', index: 60, power: 1152921504606846976} // 2^60
];

我已经检查了Google Chrome和Firefox中的值,所有值都可以使用,直到2 ^ 54。但对于2 ^ 55和更高,这个数字奇怪地四舍五入:

var the_array = [
    // ...
    {name: 'blabla', index: 54, power: 18014398509481984}, // 2^54 (fine)
    {name: 'blabla', index: 55, power: 36028797018963970}, // 2^55 (wrong, it should be 36028797018963968)
    {name: 'blabla', index: 56, power: 72057594037927940}, // 2^56 (wrong, it should be 72057594037927936)
    {name: 'blabla', index: 57, power: 144115188075855870}, // 2^57 (wrong, it should be 144115188075855872)
    {name: 'blabla', index: 58, power: 288230376151711740}, // 2^58 (wrong, it should be 288230376151711744)
    {name: 'blabla', index: 59, power: 576460752303423500}, // 2^59 (wrong, it should be 576460752303423488)
    {name: 'blabla', index: 60, power: 1152921504606847000} // 2^60 (wrong, it should be 1152921504606846976)
];

可以在两种浏览器(Chrome和Firefox)上确认相同的结果。只需打开控制台并输入原始数字“1152921504606846976”并按Enter键,它应该返回舍入的数字作为回声,不需要特殊功能。

我对这组数字的需求是非常具体的,但我真的很想理解为什么Windows 10计算器程序可以毫无问题地处理这些值,而浏览器则不能。

我也尝试过使用Opera Neon(64位)(据我所知)基于Chromium并且我收到相同的结果,所以看起来使用32位或64位浏览器在这种情况下没有区别

我使用的是Windows 10 Pro,64位;谷歌浏览器版本57.0.2987.133(32位),Firefox 52.0.2(32位)和Opera Neon版本1.0.2459.0(64位)。

我已经意识到在Javascript中正确保存2 ^ 54只是巧合;我尝试过18014398509481983(即((2 ^ 54) - 1))并且浏览器控制台再次将其设置为18014398509481984(参见最后一位数字)。如果我尝试使用18014398509481982(即((2 ^ 54) - 2))这次值保持正确。在所有提到的浏览器中都会再次发生这种情况。

我在这里遗漏了一些东西,虽然我无法弄清楚那可能是什么。

0 个答案:

没有答案