Столкнулся с такой проблемой, для бухгалтерского документа вычисляется сумма НДС. Высушил код до минимума, чтобы было понятно, в чем разница: Код (Text): <?php $price = 7732.35; $nds = 0.18; $qnty = 25; $total_1 = round($price*$nds*$qnty, 2); $total_2 = round($price*$qnty*$nds, 2); echo 'total1:'.$total_1.' <br> total2:'.$total_2; Получаем на выходе: total1: 34 795,58 total2: 34 795,57 Мне казалось, что от перемены мест множителей произведение не должно меняться. И что сначала должно все перемножиться, а потом округлиться. Это у round такой алгоритм, что ему лучше скармливать уже конкретное число, или я где-то туплю??
number_format() я этого раунда наелся при расчетах результатов соревнований, не стоит его использовать там, где нужна точность
Эта функция изначально и была. С ней то же самое. Короче говорят, что это особенности вычислений с плавающей точкой...
total1:34795.58 total2:34795.58 Добавлено спустя 2 минуты 47 секунд: на двух ОС и разных версиях PHP причем. одна из них 64bit. Добавлено спустя 5 минут 15 секунд: а вообще правило "от перемены мест результат не меняется" это из абстрактной математики, а не из реальной жизни. точность вычислений с плавающей запятой ограничена. и не все числа имеют точное машинное представление. поэтому результат первого произведения может быть уже усечен до N знака, после второго произведения эти потерянные разряды могут стать более заметны или менее заметны в зависимости от множителя. Добавлено спустя 2 минуты 47 секунд: меня бухгалтер учила: "при расчете на калькуляторе сначала умножай, а потом дели, а не наоборот. иначе точность может пострадать" — это реальность, детка.
Одинаково, проверил тоже. Хотя некоторые такие ситуации, можно решить приведением к строке и обратно =)
total1:34795.58 total2:34795.58 php -v PHP 5.4.11 (cli) (built: Feb 12 2013 17:53:30) P.S. Linux 3.10.19
Ну так уж быть total1:34795.58 total2:34795.58 #php -v PHP 5.4.23 (cli) (built: Dec 11 2013 06:48:07) OS: CentOS x86_64
короче я понял, проблема в винде ) total1:34795.58 total2:34795.58 -bash-4.1$ php -v PHP 5.3.3 (cli) (built: Nov 22 2013 10:59:29) OS: -bash-4.1$ cat /proc/version Linux version 2.6.32-279.el6.x86_64
умножте всё в 10000 раз и работайте с целыми числами на 64 бит хостинге. у php же вроде на 64 бит системе 64 бит на числа?
Если посчитать бинарными функциями произвольной точности: Код (PHP): <?php $price = '7732.35'; $nds = '0.18'; $qnty = '25'; $total_1 = bcmul(bcmul($price, $nds, 4), $qnty, 4); $total_2 = bcmul(bcmul($price, $qnty, 4), $nds, 4); echo 'total1:'.$total_1.' <br> total2:'.$total_2; то видим, что округлять приходится число Код (Text): 34795.5750 Округляем Код (PHP): echo '<div>',round($total_1, 2),'</div>'; , железно получаем Код (Text): 34795.58