Значение тригонометрии не соответствует действительности - PullRequest
1 голос
/ 22 октября 2011

Я использую toRadians(), чтобы преобразовать значение и найти тригонометрию, такую ​​как

dataMain = Math.cos(Math.toRadians(dataSub);

но у меня есть проблема, такая как dataSub = 60

Ответ должен быть 0.5 но ответ в моей программе 0.50000000000001

Или даже dataSub = 30

dataMain = Math.sin(Math.toRadians(dataSub);

ответ в моей программе: 0.49999999999994

Как я могу решить эту проблему?

Ответы [ 4 ]

5 голосов
/ 22 октября 2011

Когда вы конвертируете угол из градусов в радианы, в результате получается число, которое обычно не может быть точно представлено в виде числа с плавающей запятой.У вас есть только около 16 цифр для работы.

Итак, когда вы вычисляете косинус toRadians(60), вы фактически вычисляете косинус числа, очень близкого, но не равного π / 3.

Как вы хотите это исправить, зависит от вашего приложения.В подавляющем большинстве реальных приложений небольшая неточность, подобная этой, на самом деле не имеет значения.Если вы хотите представить результат красиво, то вы можете просто округлить до нужного количества цифр.

1 голос
/ 25 октября 2011
0 голосов
/ 25 октября 2011

То, что сказал Джеффри, абсолютно правильно, особенно в этом случае. Тем не менее, вы можете найти аналогичные результаты из-за следующей проблемы: часто числа с плавающей запятой представляются внутренне, используя базу 2. Это означает, что ваши числа записываются как мантисса * 2 ^ (экспонента). Это эффективно берет ваш номер и конвертирует его в базу 2, что не всегда идеально. Скажем, вы хотите представить 0,2 внутри. Бинарное представление 0.2 не является конечным, на самом деле это 0.00110011 ... (точно так же, как 1/3 - это 0.3333 ... в базе 10). Поскольку для мантиссы вы храните только конечное число цифр, число будет усечено при сохранении, а затем, когда оно будет преобразовано обратно в десятичную для печати, оно будет отображаться как 0,19999 ... вместо 0,2. Например, я часто замечал это в python. Вы можете просто набрать 0.2 в интерактивной оболочке, и она будет выплевывать что-то близкое к 0.2, но немного меньше или больше.

0 голосов
/ 22 октября 2011

Дроби хранятся в виде чисел с плавающей запятой, которые по сути являются приблизительным значением;это вызывает небольшие неточности, такие как описанные вами.Мудрые головы, чем моя, покрыли это при sin, cos, tan и ошибке округления

Лучший обходной путь - округлить значение до приемлемого числа цифр, и несколько методов покрыты Как округлить число до n знаков после запятой в Java

...