I'trying для преобразования плавания в международное значение в php:
var_dump((int)(39.3 * 100.0)); //Returns 3929 but should be 3930!
var_dump((int)(39.2 * 100.0)); //Returns 3920
Я могу использовать, перекрывают, чтобы заставить его работать, но кто-то может объяснить это мне?
var_dump((int)ceil(39.3 * 100.0)); //Returns 3930
Это связано с тем, что числа, которые имеют конечное представление в базе 10, могут иметь или не иметь точное представление в представлении с плавающей запятой, которое использует PHP.
См.
>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));" string(45) "3929.9999999999995452526491135358810424804688"
Поскольку int
всегда округляет число в меньшую сторону, небольшая ошибка в представлении приводит к округлению его на одно число в меньшую сторону, чего вы в противном случае ожидали бы.
Вместо этого рассмотрите возможность использования раунда
.
Вам стоит заглянуть на эту страницу: http://php.net/manual/en/language.types.float.php. Здесь описаны подводные камни при работе с числами с плавающей запятой.