В Java существуют два основных типа для представления чисел с плавающей запятой: float (32 бита) и double (64 бита). float менее точен и занимает меньше памяти, а double обеспечивает большую точность и является предпочтительным типом по умолчанию для чисел с плавающей запятой.
Важные особенности:
Пример сравнения с дельтой:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("Равны с учётом погрешности"); } else { System.out.println("Не равны"); } } }
Вопрос: Что выведет следующий код?
System.out.println(0.1 + 0.2 == 0.3);
Ответ: Этот код выведет false, потому что результат суммы 0.1 + 0.2 в двоичном формате IEEE 754 не равен точно 0.3 из-за особенностей хранения десятичных дробей в типах float и double.
История
На одном крупном финансовом проекте использовались счетчики денежных средств в типе double. На практике небольшие операции часто приводили к накоплению ошибок округления, в результате чего итоговые суммы отличались на несколько центов. Проблема была устранена заменой double на BigDecimal.
История
В game engine использовался массив float для хранения координат объектов в мире с большими значениями. При перемещении на большие расстояния началась теряться точность позиционирования объектов, что привело к "дрожанию" объектов на экране. Замена float на double и центрация координат помогли устранить проблему.
История
В программе статистического анализа сравнивали двойные значения с помощью оператора
==и получали неожиданное количество "несовпадений". После замены на сравнение с дельтой логика программы заработала корректно.