Функция пола PHP - PullRequest
       16

Функция пола PHP

2 голосов
/ 17 августа 2011

Кто-нибудь знает, почему floor(61681) = 61681, но floor(616.81*100) = 61680?

Я пробовал многие другие значения, такие как

floor(716.81*100) = 71681
floor(816.81*100) = 81681
floor(916.81*100) = 91681
floor(616.83*100) = 61683

Кто-нибудь знает, почему это произошло?

1 Ответ

7 голосов
/ 17 августа 2011

Из-за характера двоичных чисел с плавающей запятой произойдут внутренние неточности округления. Невозможно точно представить 616.81 как двоичное число с плавающей точкой - его ближайшее приближение фактически немного меньше, чем 616.81. 61681 может быть представлен точно, однако.

Когда представление 616.81 умножено на 100, результат будет чуть меньше 61681, и, таким образом, вызов floor вернет 61680.

http://codepad.org/H0wh2itg

Если вы хотите абсолютной точности, вы можете использовать математические функции BC BC, которые могут быть настолько точными, насколько вам нужно, за счет производительности. Например:

var_dump(floor(bcmul(616.18, 100, 12)));
...