Округление сотых после запятой в Java

119
02 января 2022, 00:20

Есть пара примеров :

  double a = 100.00;
  double b = 99.33;
  double res = b-a;   //Получится -0.67  OK
  double x = 100.00;
  double y = 99.95;
  double res2 = y-x;  // Получится -0.04 ???

Вопрос, почему во втором примере теряется 0.01 ? Как это можно исправить. Пробовал BigDecimal(ROUND_CEILING/FLOOR), но в таком случае уже первый вариант считается неверно.

Отбрасывать знаки после запятой НЕ НУЖНО

Answer 1

Примитивы с плавающей точкой не гарантируют математическую точность в вычислениях из-за особенностей их представления в памяти и операций над ними (кстати, поэтому не следует проверять такие значения на точное равенство, а нужно проверять попадание в интервал) . Если нужна математическая точность, следует пользоваться объектами класса BigDecimal.

Answer 2

"Получится -0.04" - только если Вы отбросите все, начиная с третьей цифры после запятой.

System.out.println(res2); // -0.04999999999999716
System.out.println(Math.round(res2 * 100) / 100.0); // -0.05
System.out.println(String.format("%f", res2)); // -0.050000
System.out.println(String.format("%.2f", res2)); // -0.05
READ ALSO
Как ограничить JVM по кол-ву CPU в Linux

Как ограничить JVM по кол-ву CPU в Linux

Есть какой-то сервер к примеру с 16 CPUЕсть JVM (OpenJDK 8u), запускаемая на нем

145
NullPointerException при работе с массивом классов Java

NullPointerException при работе с массивом классов Java

У меня есть массив класса VKUserПользователь моей программы должен вводить данные о пользователях, после чего они отправляются в класс через...

161
Как настроить Android App Bundles чтобы опубликовать apk (PWA)?

Как настроить Android App Bundles чтобы опубликовать apk (PWA)?

Есть сайт с PWA, нужно опубликовать его в Google PlayСделал все по статье: https://habr

169