четверг, 23 декабря 2010 г.

Подводные камни дробных чисел

В PHP такой код выдаёт странный, на первый взгляд, результат:
$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
Поэтому стоит избегать использовать числа с плавающей точкой там, где требуется целочисленный результат.

Комментариев нет:

Отправить комментарий