$x = (0.1+0.7)*10;Казалось бы, должна быть всегда восьмёрка. Но этот код выдаст:
echo $x, "\n";
printf("%d\n", $x);
echo (int)$x, "\n";
printf("%0.10f\n", $x);
8Всё становится ясно, если в код добавить такую строку:
7
7
8.0000000000
printf("%0.20f\n", $x);Получим число 7.99999999999999911182
Т.е. в памяти была далеко не восьмёрка, а приведение типа просто отбрасывает дробную часть. Если округлить результат, то точность повысится:
$x = round((0.1+0.7)*10);Выдаст:
echo $x, "\n";
printf("%d\n", $x);
echo $x, "\n";
printf("%0.10f\n", $x);
printf("%0.20f\n", $x);
8Поэтому стоит избегать использовать числа с плавающей точкой там, где требуется целочисленный результат.
8
8
8.0000000000
8.00000000000000000000
Комментариев нет:
Отправить комментарий