2013-08-06 2 views
-1

У меня есть глупый вопрос. Почему это дает 488.15999999999997 вместо 488.16Конфликтующее десятичное значение с двойным типом данных в java

double dbl = 427.14 + 61.02; 
System.out.println(dbl); 

Я слышал, что мы должны использовать BigDecimal, если мы рассматриваем эту большую точность (например, связанные логики валюты). Но я хочу знать, что стоит за этим.

+3

[Что каждый ученый должен знать о плавающей запятой, арифметика] (http://docs.oracle.com/cd/E19957-01/806-3568 /ncg_goldberg.html) –

+2

Попробуйте [Калькулятор IEEE 754] (http://www.binaryconvert.com/convert_double.html): вставьте свое значение для десятичной дроби и посмотрите, что произойдет. Это стоит тысячи слов! – dasblinkenlight

+0

Спасибо всем за ваши комментарии. Я отметил, что эта тема доступна во многих местах. Но я хотел узнать точную причину этого. ОК за минус голоса. Я заслужил это. Но ваши рекомендации очень полезны для меня. Я получил много знаний о значениях с плавающей запятой в java – namalfernandolk

ответ

1

Это нормальное поведение. Помните, что в общем случае десятичные значения не могут быть представлены точно на компьютере, поэтому небольшие ошибки начнут ползать. Взгляните на What Every Computer Scientist Should Know About Floating-Point Arithmetic, это обязательное чтение для тех, кто пишет код, имеющий десятичные значения.

+1

* «Помните, что десятичное значение не может быть точно представлено на компьютере» * Он * может *, он просто * не * в плавающей точке IEEE 754. –

+0

Это может быть, если у вас бесконечная память. В практическом смысле, и в общем случае, это невозможно. –

+0

@ Óscar: Нет, это совсем не так. Это всего лишь вопрос о том, сколько десятичных разрядов вы хотите удержать. Или, точнее, сколько значительных цифр вы хотите. Чтобы получить тот же диапазон, что и «double», но с идеальной десятичной точностью, вам нужно всего лишь 56 значащих цифр и показатель того, где находится десятичная точка. Конечно, десятичные числа имеют свои собственные проблемы, например, неспособность точно хранить '1/3'. ;-) –

Смежные вопросы