Когда использовать BigDecimal вместо double. Почему код ниже отображает это

При использовании BigDecimal вместо double, почему в строке 8 отображается 0.01, а в строке 4 - 0.009999999999999998?

double a = 0.02;
double b = 0.03;
double c = b - a;
System.out.println(c); // line #4 prints 0.009999999999999998
BigDecimal _a = new BigDecimal("0.02");
BigDecimal _b = new BigDecimal("0.03");
BigDecimal _c = _b.subtract(_a);
System.out.println(_c); // line #8 prints 0.01

См. Также: stackoverflow.com/questions/3413448/double-vs-bigdecimal

lexicore 06.04.2018 20:20

что не так с 0.009999999999999998 ?? мне кажется 0,01 :)

RAZ_Muh_Taz 06.04.2018 20:21

@RAZ_Muh_Taz Это имеет значение в финансовых расчетах, анализе цен на акции, анализе цен на газ, вычислении высоты для самолетов и т. д. В некоторых других сценариях это не имеет значения.

humblefoolish 06.04.2018 20:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
1 112
1

Ответы 1

Это случилось со мной когда-то назад, когда я работал в финансовой фирме, и разница в 1 цент в расчетах заставила меня работать все выходные.

Все зависит от того, как числа с плавающей запятой (которые состоят из двух частей - мантиссы и экспоненты) хранятся на оборудовании и всегда имеют свойство точности.

двойники страдают одним и тем же свойством точности (указывающим, насколько точно оно представлено).

BigDecimal является точным представлением чисел с плавающей запятой и не имеет precision. Итак, для любых финансовых расчетов BigDecimal - это путь, где разница в 0,0001 имеет значение. При этом он медленнее по сравнению с использованием double.

Вы должны прочитать BigDecimal javadoc, это будет хорошее чтение и просветит вас.

github.com/mortezaadi/bigdecimal-utils
Morteza Adi 30.09.2018 13:48

Другие вопросы по теме