在JavaScript中评估Math.sin(Math.PI)
时,结果为1.2246063538223773e-16
而不是0
。我想这是由于JavaScript Number
的精度有限以及窦算法的精度有限。
如何防止这些舍入错误?使用具有更高精度的BigNumber类型和更高精度的窦算法会有帮助吗?或者这只是给你一个较小的舍入错误,但仍然是一个错误?
答案 0 :(得分:2)
我使用Number.EPSILON来排序舍入错误。这主要是受支持的,但链接的页面有一个IE的polyfill
var sinTheta = Math.sin(theta);
if (Math.abs(sinTheta) < Number.EPSILON) {
sinTheta = 0;
}
答案 1 :(得分:0)
使用Math.sin(Math.PI).toFixed(2)
,.toFixed
的参数是您需要的精度。
不幸的是,IEEE 754并不完美,内存也很有限......当你:0.1 + 0.2 == 0.30000000000000004
您应该知道.toFixed(precision)
的结果是字符串,因此您可能需要:
parseFloat(Math.sin(Math.PI).toFixed(2));