【问题标题】:Javascript Math.cos and Math.sin are inaccurate. Is there any solution?Javascript Math.cos 和 Math.sin 不准确。有什么解决办法吗?
【发布时间】:2011-06-03 06:12:52
【问题描述】:

Javascript 数学三角函数返回错误的结果。 试试

alert(Math.sin(Math.PI));

它不返回 0。

也许问题在于 javascript 十进制数的精度。是否有任何解决方法可以获得正确的结果?

【问题讨论】:

  • 您是否可以接受四舍五入的结果? 1.2246467991473532e-16 非常小,四舍五入会将其转换为 0。好吧,JS 的Math 不是为高精度数学开发的:-(
  • Floating point numbers and JavaScript modulus operator 的可能副本,可能还有数百个副本。
  • 有限精度的问题...(尽管1-Math.pow(Math.cos(Math.PI),2) == 0
  • 也许你应该阅读“每个计算机科学家应该知道的关于浮点运算的知识”:download.oracle.com/docs/cd/E19957-01/806-3568/…
  • 刚刚注意到这一点。简直是疯了。你会认为他们可以优化 sin 来给出正确的答案。

标签: javascript math


【解决方案1】:

不过,它非常非常接近于零。 (~ 10^-16)

alert(Math.sin(Math.PI/2)) 确实返回1

这只是处理浮点运算时必须小心的一件事。到处都是舍入错误。

【讨论】:

    【解决方案2】:

    你可以使用

    Math.sin(Math.PI).toFixed(3) // "0.000"

    示例:

    const cos = (a) => Math.cos(Math.PI * a / 180); cos(90) // 6.123233995736766e-17

    那么你可以使用.toFixed()

    cos(90).toFixed(3) // "0.000"

    注意

    .toFixed() 返回字符串,因此您可以使用parseFloat() 将其解析为浮点数

    parseFloat(cos(90).toFixed(3)) // 0.000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-28
      • 2020-10-24
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      相关资源
      最近更新 更多