考虑以下:
var x = 2.175;
console.log(x.toFixed(2)); // 2.17
什么?不,这并不奇怪。这很明显,请参阅:数字文字2.175
实际上存储在内存中(根据 IEEE-754 规则),其值仅比 2.175 小一点点。这很容易证明:
console.log(x.toFixed(20)); // 2.17499999999999982236
这就是它在 32 位 Windows 设置上的最新版本 Firefox、Chrome 和 Opera 中的工作方式。但这不是问题。
真正的问题是 Internet Explorer 6(!)实际上是如何做到的正确的就像人类一样:
var x = 2.175;
console.log(x.toFixed(2)); // 2.18
console.log(x.toFixed(20)); // 2.17500000000000000000
好吧,我夸大了:实际上我测试过的所有 Internet Explorer(IE8-11,甚至 MS Edge!)的行为方式都是一样的。还是,WAT?
更新:它变得陌生:
x=1.0;while((x-=0.1) > 0) console.log(x.toFixed(20));
IE Chrome
0.90000000000000000000 0.90000000000000002220
0.80000000000000000000 0.80000000000000004441
0.70000000000000010000 0.70000000000000006661
0.60000000000000010000 0.60000000000000008882
0.50000000000000010000 0.50000000000000011102
0.40000000000000013000 0.40000000000000013323
0.30000000000000015000 0.30000000000000015543
0.20000000000000015000 0.20000000000000014988
0.10000000000000014000 0.10000000000000014433
0.00000000000000013878 0.00000000000000013878
为什么不同 - 除了最后一个?为什么最后一个没有区别?顺便说一句,它与 非常相似x=0.1; while(x-=0.01)...
:直到我们非常接近于零,toFixed
在 IE 中显然试图偷工减料。
免责声明:我知道浮点数学有点缺陷。我不明白的是 IE 和浏览器世界的其他部分有什么区别。