为什么console.log只显示由0.1 + 0.2 = 0.30000000000000004产生的部分数字

时间:2016-05-20 06:44:52

标签: javascript binary ieee-754

这个问题还没有被问到stackoverlow!我不是在问为什么0.1 + 0.2不等于0.3,我问的是非常不同的东西!请在将其标记为重复之前阅读该问题。

我已经编写了这个函数,它显示了JavaScript如何以64位存储浮点数:

function to64bitFloat(number) {
    var f = new Float64Array(1);
    f[0] = number;
    var view = new Uint8Array(f.buffer);
    var i, result = "";
    for (i = view.length - 1; i >= 0; i--) {
        var bits = view[i].toString(2);
        if (bits.length < 8) {
            bits = new Array(8 - bits.length).fill('0').join("") + bits;
        }
        result += bits;
    }
    return result;
}

现在我想检查0.1+0.2的结果是否实际存储,因为它显示在控制台0.30000000000000004中。所以我做了以下几点:

var r = 0.1+0.2;
to64bitFloat(r);

结果数字是:

0 01111111101 0011001100110011001100110011001100110011001100110100

现在,让我们将其转换为二进制文件:

计算指数:

01111111101 = 1021
1021 - 1023 = -2 

全部了解,

1.0011001100110011001100110011001100110011001100110100 x 2 ** -2 =
0.010011001100110011001100110011001100110011001100110100

现在,如果我们使用this converter将结果数转换为十进制数,我们得到:

0.3000000000000000444089209850062616169452667236328125

为什么没有控制台显示整个数字,而不仅仅是它的更多有效数字?

2 个答案:

答案 0 :(得分:4)

console.log方法是非标准的。在Firefox中,您可以使用format specifier

指定小数位数
console.log('%.60f', 0.1 + 0.2)

给出

0.300000000000000044408920985006261616945266723632812500000000

与转换器给出的数字相同。

请注意,这在chrome中不起作用。

总结:

  • Javascript编号以IEEE 754-2008双精度64位二进制格式存储。
  • 数字的字符串表示形式在ECMAScript standard
  • 中定义
  • console.log方法取决于浏览器,Firefox实现允许指定任意数量的小数位数来显示数字。

答案 1 :(得分:2)

实际上你不必写这么长的问题。你可以做的只是打开控制台并键入:

  

var a = 0.3000000000000000444089209850062616169452667236328125;

     

的console.log(a)的

仍会给你结果 - 0.30000000000000004(至少在谷歌Chrome控制台中)。

之所以如此,是因为JS的局限性,只允许显示浮点数的16个字符。您可以在回答此问题时阅读更多内容:https://stackoverflow.com/a/19613321/3014041