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.SU

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


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

> Без описания
Greider
Отправлено: 20 Декабря, 2013 - 13:02:27
Post Id


Новичок


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


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




Столкнулся с такой проблемой, для бухгалтерского документа вычисляется сумма НДС.
Высушил код до минимума, чтобы было понятно, в чем разница:

CODE (text):
скопировать код в буфер обмена
  1. <?php
  2.  
  3. $price = 7732.35;
  4. $nds = 0.18;
  5. $qnty = 25;
  6. $total_1 = round($price*$nds*$qnty, 2);
  7. $total_2 = round($price*$qnty*$nds, 2);
  8.  
  9. echo 'total1:'.$total_1.'
  10. <br>
  11. total2:'.$total_2;
  12. ?>


Получаем на выходе:
total1: 34 795,58
total2: 34 795,57

Мне казалось, что от перемены мест множителей произведение не должно меняться.
И что сначала должно все перемножиться, а потом округлиться.
Это у round (number_format так же себя ведет) такой алгоритм, что ему лучше скармливать уже конкретное число, или я где-то туплю??

(Отредактировано автором: 20 Декабря, 2013 - 13:03:14)

 
 Top
Мелкий Супермодератор
Отправлено: 20 Декабря, 2013 - 13:13:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Это float как он есть.
Ваш код даёт в результате 34795.6, поэтому не столь наглядно.
Выведите var_dump'ом оба числа без округления и будет между ними разница незначительная где-нибудь видна (этак, в 10 знаке после запятой, одно 0,5749999(9), второе - 0,5750000(0)).

http://www.php.net/manual/en/book.bc.php


-----
PostgreSQL DBA
 
 Top
esterio
Отправлено: 20 Декабря, 2013 - 13:13:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




почитайте про числа с плаваючей комой, сдесь не раз на форуме обсуждалось, да й в офф. доке подробно расписано
 
 Top
caballero
Отправлено: 20 Декабря, 2013 - 13:14:27
Post Id


Активный участник


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


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




лучше всего оперировать (в том числе хранить в Бд) в копейках а не в рублях
только когда уже выводить на экран и на печать переводить в рубли
(Добавление)
Цитата:
почитайте про числа с плаваючей комой

на российском языке кома - исключительно медицинский термин Улыбка


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Greider
Отправлено: 20 Декабря, 2013 - 13:36:04
Post Id


Новичок


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


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




Спасибо за ответы!
Мелкий пишет:
Выведите var_dump'ом оба числа без округления

А как вывести их, скажем, до 10-го знака?
Если просто var_dump($total), где $total - произведение без округления, то выдает ожидаемо float(34795.575) в обоих случаях.
Цитата:

лучше всего оперировать (в том числе хранить в Бд) в копейках а не в рублях
только когда уже выводить на экран и на печать переводить в рубли

Интересный маневр )
 
 Top
caballero
Отправлено: 20 Декабря, 2013 - 13:40:35
Post Id


Активный участник


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


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




Цитата:
Интересный маневр )

это не маневр а стандартная практика
кстати с целыми быстрее работает БД
(Добавление)
Цитата:
А как вывести их, скажем, до 10-го знака

в PHP есть специальная библиотека для рабты с большми числами


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 20 Декабря, 2013 - 13:44:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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





caballero пишет:
на российском языке кома - исключительно медицинский термин

поправлю себя "точкой"
 
 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