Max*_*kyi 5 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;
}
Run Code Online (Sandbox Code Playgroud)
现在我想检查0.1+0.2实际存储的结果是否显示在控制台中0.30000000000000004.所以我做了以下事情:
var r = 0.1+0.2;
to64bitFloat(r);
Run Code Online (Sandbox Code Playgroud)
结果数字是:
0 01111111101 0011001100110011001100110011001100110011001100110100
Run Code Online (Sandbox Code Playgroud)
现在,让我们将其转换为二进制文件:
计算指数:
01111111101 = 1021
1021 - 1023 = -2
Run Code Online (Sandbox Code Playgroud)
把它们放在一起,
1.0011001100110011001100110011001100110011001100110100 x 2 ** -2 =
0.010011001100110011001100110011001100110011001100110100
Run Code Online (Sandbox Code Playgroud)
现在,如果我们使用此转换器将结果数转换为十进制,我们得到:
0.3000000000000000444089209850062616169452667236328125
Run Code Online (Sandbox Code Playgroud)
为什么控制台不显示整数,而不仅仅是更有意义的数字?
console.log方法是非标准的。在 Firefox 中,您可以使用格式说明符指定小数位数
console.log('%.60f', 0.1 + 0.2)
Run Code Online (Sandbox Code Playgroud)
给出
0.300000000000000044408920985006261616945266723632812500000000
Run Code Online (Sandbox Code Playgroud)
该数字与转换器给出的数字相同。
请注意,这在 Chrome 中不起作用。
综上所述: