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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Погрешность вычислений PHP

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
gg.
Отправлено: 16 Мая, 2011 - 20:51:21
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




Очень удивился, когда увидел, но в PHP появляется погрешность при математических вычислениях дробных чисел. Например:

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


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

Кто-нибудь знает, как с этим бороться?

(Отредактировано автором: 16 Мая, 2011 - 20:52:09)

 
 Top
demot
Отправлено: 16 Мая, 2011 - 20:56:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)





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


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Март 2011  


Помог: 0 раз(а)




Спасибо.

Для решение этой конкретной задачи подходит round($L*100,2).
Хотя почему вознимает погрешность в PHP при таких малых числах мне все равно не понятно.
 
 Top
demot
Отправлено: 16 Мая, 2011 - 21:09:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 143
Дата рег-ции: Окт. 2010  


Помог: 3 раз(а)




Я бы назвал это не погрешностью, а излишней точностью Радость
 
 Top
Stierus Супермодератор
Отправлено: 17 Мая, 2011 - 10:42:04
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




gg. в Яве то же самое (в Си и других языках - не знаю, но не удивлюсь, если там так же), это нужно учитывать при работе с нецелыми типами и все Улыбка Поэтому программисты не сравнивают нецелые числа на строгое равенство Улыбка
 
My status
 Top
Ch_chov
Отправлено: 17 Мая, 2011 - 12:16:04
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




PHP:
скопировать код в буфер обмена
  1. echo ini_set('precision', 10);
  2. $L = 10387.8 - 10387;
  3. print ($L);
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB