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.SU » » Вопросы новичков » Проблема округления произведения

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

1. Greider - 20 Декабря, 2013 - 13:02:27 - перейти к сообщению
Столкнулся с такой проблемой, для бухгалтерского документа вычисляется сумма НДС.
Высушил код до минимума, чтобы было понятно, в чем разница:

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 так же себя ведет) такой алгоритм, что ему лучше скармливать уже конкретное число, или я где-то туплю??
2. Мелкий - 20 Декабря, 2013 - 13:13:02 - перейти к сообщению
Это float как он есть.
Ваш код даёт в результате 34795.6, поэтому не столь наглядно.
Выведите var_dump'ом оба числа без округления и будет между ними разница незначительная где-нибудь видна (этак, в 10 знаке после запятой, одно 0,5749999(9), второе - 0,5750000(0)).

http://www.php.net/manual/en/book.bc.php
3. esterio - 20 Декабря, 2013 - 13:13:30 - перейти к сообщению
почитайте про числа с плаваючей комой, сдесь не раз на форуме обсуждалось, да й в офф. доке подробно расписано
4. caballero - 20 Декабря, 2013 - 13:14:27 - перейти к сообщению
лучше всего оперировать (в том числе хранить в Бд) в копейках а не в рублях
только когда уже выводить на экран и на печать переводить в рубли
(Добавление)
Цитата:
почитайте про числа с плаваючей комой

на российском языке кома - исключительно медицинский термин Улыбка
5. Greider - 20 Декабря, 2013 - 13:36:04 - перейти к сообщению
Спасибо за ответы!
Мелкий пишет:
Выведите var_dump'ом оба числа без округления

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

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

Интересный маневр )
6. caballero - 20 Декабря, 2013 - 13:40:35 - перейти к сообщению
Цитата:
Интересный маневр )

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

в PHP есть специальная библиотека для рабты с большми числами
7. esterio - 20 Декабря, 2013 - 13:44:19 - перейти к сообщению

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

поправлю себя "точкой"

 

Powered by ExBB FM 1.0 RC1