Весьма часто простые дроби вроде 0.1 или 0.7 не могут
конвертироваться в их внутренние двоичные представления без потери точности. Это
может привести к парадоксальным результатам: например, floor((0.1+0.7)*10)
обычно возвращает 7 вместо ожидаемого 8 как результат внутреннего
представления приблизительного числа 7.9999999999.... Причиной
является то, что невозможно точно выразить некоторые дроби в десятичной нотации
конечным количеством цифр. Например, 1/3 в десятичной форме имеет вид
0.3333333... Итак, никогда не полагайтесь на точность результата
с плавающей точкой до последней цифры и никогда не проверяйте равенство чисел
с плавающей точкой. Если вам нужна действительно высокая точность вычислений,
вы должны использовать math-функции произвольной точности
или gmp. |