Это потому, что числа, которые имеют конечное представление в базе 10, могут иметь или не иметь точное представление в представлении с плавающей запятой, которое использует PHP.
См
>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));"
string(45) "3929.9999999999995452526491135358810424804688"
Поскольку int
всегда округляет число вниз, небольшая ошибка в представлении приводит к тому, что приведенное число округляется на одно число меньше, чем вы ожидаете.
Попробуйте вместо этого использовать round
.