为什么 console.log 只显示 0.1+0.2=0.30000000000000004 产生的部分数字
Why console.log shows only part of the number resulting from 0.1+0.2=0.30000000000000004
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
为什么控制台不显示整数,而只是显示更有效的数字?
console.log method is non-standard. In Firefox, you can specify the number of decimal with a format specifier
console.log('%.60f', 0.1 + 0.2)
给予
0.300000000000000044408920985006261616945266723632812500000000
这与您的转换器给出的数字相同。
请注意,这在 chrome 中不起作用。
结论:
- Javascript 数字以 IEEE 754-2008 双精度 64 位二进制格式存储。
- 数字的字符串表示在 ECMAScript standard.
中定义
- console.log 方法依赖于浏览器,Firefox 实现允许指定任意小数位来显示数字。
其实不用写这么长的问题。你可以做的只是打开控制台并输入:
var a = 0.3000000000000000444089209850062616169452667236328125;
console.log(a);
这仍然会给你结果 - 0.30000000000000004(至少在 Google chrome 控制台中)。
之所以会这样,是因为JS的限制,只允许显示16个字符的浮点数。您可以阅读更多内容来回答这个问题:
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
为什么控制台不显示整数,而只是显示更有效的数字?
console.log method is non-standard. In Firefox, you can specify the number of decimal with a format specifier
console.log('%.60f', 0.1 + 0.2)
给予
0.300000000000000044408920985006261616945266723632812500000000
这与您的转换器给出的数字相同。
请注意,这在 chrome 中不起作用。
结论:
- Javascript 数字以 IEEE 754-2008 双精度 64 位二进制格式存储。
- 数字的字符串表示在 ECMAScript standard. 中定义
- console.log 方法依赖于浏览器,Firefox 实现允许指定任意小数位来显示数字。
其实不用写这么长的问题。你可以做的只是打开控制台并输入:
var a = 0.3000000000000000444089209850062616169452667236328125;
console.log(a);
这仍然会给你结果 - 0.30000000000000004(至少在 Google chrome 控制台中)。
之所以会这样,是因为JS的限制,只允许显示16个字符的浮点数。您可以阅读更多内容来回答这个问题: