【发布时间】:2016-05-20 15:26:12
【问题描述】:
这个问题还没有在 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
为什么控制台不显示整数,而只是显示更多有效数字?
【问题讨论】:
-
不是重复的,请看问题
-
它可能是其他东西的副本,但不是之前标记的那个。请阅读问题。这个问题与浮点加法无关。这是关于精度。
-
这可能很有趣,尽管它不能完全回答问题:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
-
@slebetman,谢谢,我去看看。这可以给我一个提示来理解不一致
标签: javascript binary ieee-754