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