Ссылка @ Сэм предложил велик, но все еще слишком технический для меня: P
Я просто приведу некоторые мнения в ОП для обработки чисел с плавающей точкой (возможно, немного не по теме, потому что вы просите причину. По этой причине прочитайте ссылку @Sam).
Никогда не предполагайте, что число с плавающей точкой будет давать вам точные изображения. Иногда это может, но не всегда. Плавающая точка имеет свое ограничение в «значимых цифрах», которое является «точной» для первой n-й цифры.
Ваша ситуация еще хуже, потому что вы смешиваете float и double, но идея решить аналогична.
Вам необходимо решить, для какой точности вашему приложению нужен результат вычисления, и принять решение о его базе значений Epsilon. Например, ваше приложение нуждается только в точности до 3 знаков после запятой, вероятно, Epsilon 0,0005 является разумным.
Сравнение двух чисел с плавающей запятой не должно быть сделано ==
, вы должны использовать (a + EPSILON > b && a - EPSILON < b)
. Аналогично, a > b
следует указывать как a - EPSILON > b
.1 не может быть представлен конечными значащими цифрами в двоичном представлении, например, как 1/3 не может быть представлено конечными значащими цифрами в десятичной форме. – nhahtdh