toPrecision的行为类似于round再toString吗?

4
toPrecision 的返回值是“一个字符串...它采用定点或指数表示法,四舍五入到精度位数。" 8.235 => "8.23" 不是四舍五入。为什么会不同?

var toP = function (n) {
    console.log(n, n.toPrecision(3) );
}
    
toP(1.235);  // 1.235 "1.24"
toP(2.235);
toP(3.235);
toP(4.235);
toP(5.235);
toP(6.235);
toP(7.235);
toP(8.235);  // 8.235 "8.23"  why?
.as-console-wrapper{min-height:100%}


1
我不得不检查ES标准; Number.prototype.toPrecision 它从未旨在向下舍入。 MDN文档略有错误。 - KarelG
1个回答

3

一如既往,浮点数(不)准确性是罪魁祸首。

1.235的二进制为1.0011110000101000111101011100001010001111010111000011...
截断并转换回十进制,得到1.235000000000000098,确实会四舍五入。

但8.235是1000.0011110000101000111101011100001010001111010111...
截断并转换回十进制,得到8.234999999999999432,它会向下取整。


应该总是使用这个方法代替吗?Math.round(n*1000)/1000 - Ksthawma
1
那可能只是将你的浮点误差移动了一下。 - Niet the Dark Absol
@KaFaiLo,如有需要,请查看http://floating-point-gui.de/以获取更多解释和避免此问题的建议。 - Andrzej Doyle
@AndrzejDoyle 不错,但是那个网站建议在JavaScript中使用toPrecision - Ksthawma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接