Из-за характера двоичных чисел с плавающей запятой произойдут внутренние неточности округления. Невозможно точно представить 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)));