PHP неожиданный результат плавания к международному типу брошен

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
14
задан mskfisher 5 June 2012 в 14:25
поделиться

2 ответа

Это связано с тем, что числа, которые имеют конечное представление в базе 10, могут иметь или не иметь точное представление в представлении с плавающей запятой, которое использует PHP.

См.

>php -r "echo var_dump(sprintf('%.40F', 39.3 * 100.0));"
string(45) "3929.9999999999995452526491135358810424804688"

Поскольку int всегда округляет число в меньшую сторону, небольшая ошибка в представлении приводит к округлению его на одно число в меньшую сторону, чего вы в противном случае ожидали бы.

Вместо этого рассмотрите возможность использования раунда .

17
ответ дан 1 December 2019 в 09:31
поделиться

Вам стоит заглянуть на эту страницу: http://php.net/manual/en/language.types.float.php. Здесь описаны подводные камни при работе с числами с плавающей запятой.

1
ответ дан 1 December 2019 в 09:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: