Я думаю, что это ошибка, которую мы (Java разработчики) часто совершаем, но в целом это можно наблюдать на почти всех языках программирования - по крайней мере, на тех, которые я использую в наши дни.
Все сводится к тому, как эти значения хранятся в памяти - если я не ошибаюсь, в Java, float
с и double
с хранятся в стандартном формате IEEE 754
.
В любом случае, вместо использования оператора равенства (==
), мы должны полагаться на реляционные операторы: меньше (<
) или больше (>
) для сравнения значений float
и double
, потому что, в конце, числа с плавающей точкой являются лишь приблизительными , они не являются точными.
Другой подход (мне лично нравится) заключается в использовании Float.compare
/ Double.compare
, если вы более знакомы с семантикой compareTo
-вид сравнений.
В качестве альтернативы, я иногда использую также BigDecimal
для точных вычислений.