Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Погрешность вычислений PHP
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Погрешность вычислений PHP

Страниц (1): [1]
 

1. gg. - 16 Мая, 2011 - 20:51:21 - перейти к сообщению
Очень удивился, когда увидел, но в PHP появляется погрешность при математических вычислениях дробных чисел. Например:

CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?
  3. $L = 10387.8 - 10387;
  4. print ($L);
  5.  
  6. //возвращает 0.799999999999
  7. ?>
  8.  


Ошибка возникает и при меньших числах. Проверял на двух серваках разных провайдеров, на 4 и на 5 PHP.

Кто-нибудь знает, как с этим бороться?
2. demot - 16 Мая, 2011 - 20:56:36 - перейти к сообщению

1,2,3,4 - в общем в данном примере сколько бы ни ставил, вернет все равно 0.8, потому выбирать надо из необходимой точности.
3. gg. - 16 Мая, 2011 - 21:06:45 - перейти к сообщению
Спасибо.

Для решение этой конкретной задачи подходит round($L*100,2).
Хотя почему вознимает погрешность в PHP при таких малых числах мне все равно не понятно.
4. demot - 16 Мая, 2011 - 21:09:36 - перейти к сообщению
Я бы назвал это не погрешностью, а излишней точностью Радость
5. Stierus - 17 Мая, 2011 - 10:42:04 - перейти к сообщению
gg. в Яве то же самое (в Си и других языках - не знаю, но не удивлюсь, если там так же), это нужно учитывать при работе с нецелыми типами и все Улыбка Поэтому программисты не сравнивают нецелые числа на строгое равенство Улыбка
6. Ch_chov - 17 Мая, 2011 - 12:16:04 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. echo ini_set('precision', 10);
  2. $L = 10387.8 - 10387;
  3. print ($L);

 

Powered by ExBB FM 1.0 RC1