Почему float не подходит для точного хранения десятичных дробей?

«Почему float не подходит для точного хранения десятичных дробей?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет. Типы с плавающей точкой (float, double) не предназначены для точного хранения десятичных дробей из-за особенностей двоичного представления. Это приводит к ошибкам округления.

Почему? Многие десятичные дроби (например, 0.1) не могут быть точно представлены в двоичной системе счисления, что вызывает накопление погрешности.

// Пример погрешности
System.out.println(0.1 + 0.2 == 0.3); // false
System.out.println(0.1 + 0.2); // 0.30000000000000004

Решение: Для точных вычислений (финансы, учет) используйте BigDecimal.

BigDecimal a = new BigDecimal("0.1"); // Важно: использовать строковый конструктор
BigDecimal b = new BigDecimal("0.2");
BigDecimal sum = a.add(b); // = 0.3

Когда использовать float/double? Для научных расчетов, графики, игр — где важна скорость, а абсолютная точность не критична.