如何使用Math.sin(Math.PI)防止舍入错误?

时间:2014-02-05 10:08:56

标签: javascript trigonometry

在JavaScript中评估Math.sin(Math.PI)时,结果为1.2246063538223773e-16而不是0。我想这是由于JavaScript Number的精度有限以及窦算法的精度有限。

如何防止这些舍入错误?使用具有更高精度的BigNumber类型和更高精度的窦算法会有帮助吗?或者这只是给你一个较小的舍入错误,但仍然是一个错误?

2 个答案:

答案 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));