Javascript Math.cos и Math.sin являются неточными.Есть ли решение? - PullRequest
15 голосов
/ 03 июня 2011

Тригономериальные методы Javascript Math возвращают неверные результаты. Попробуйте

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

не возвращает 0.

Возможно, проблема в точности десятичного числа javascript. Есть ли обходные пути для получения правильных результатов?

Ответы [ 3 ]

14 голосов
/ 03 июня 2011

Это очень, очень близко к нулю, хотя. (~ 10 ^ -16)

И alert(Math.sin(Math.PI/2)) возвращает 1.

Это всего лишь одна из вещей, с которой вы должны быть осторожны при работе с арифметикой с плавающей запятой. Ошибки округления появляются повсюду.

0 голосов
/ 24 марта 2019

вы можете использовать

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

0 голосов
/ 03 июня 2011

Ну, я полагаю, это потому, что Math.PI не является точным, это 3.14, а не 3.1415926. Попробуйте

alert(Math.sin(3.1415926));

Если этого еще недостаточно, вы можете попробовать использовать расширение в серии Тейлора

sin x = x - x^3 / 3! + x^5 / 5! - x^7 / 7! ......
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...