Округление чисел с плавающей запятой/десятичных дробей в электронной коммерции (PHP 8.3 и Laravel 11)Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Округление чисел с плавающей запятой/десятичных дробей в электронной коммерции (PHP 8.3 и Laravel 11)

Сообщение Anonymous »

Поскольку количество продуктов не ограничивается целыми числами, а может хранить десятичные числа до 4 цифр, у меня может быть продукт с количеством 69,4160 квадратных метров чего-то.
Теперь, предположив, что валюта — злотый (но я думаю, это не имеет значения), а ставка налога — 23%, моя корзина правильно рассчитывает промежуточные и итоговые суммы для следующих продуктов.

Код: Выделить всё

Product A: costs 129.00 * 69.4160 = 8954.6640 (11014.2367 with tax)
Product B: costs 150.00 * 1 = 150.0000 (184.5000 with tax)
Эти расчеты верны, но для людей я хочу отображать цены с точностью до 2 знаков после запятой, поэтому я вызываю Price_float_to_money_format() для промежуточной суммы корзины, налога и общей суммы.
Это мой метод:

Код: Выделить всё

if (!function_exists('price_float_to_money_format')) {
function price_float_to_money_format($price): string
{
//        return $price;

$formatter = new NumberFormatter('pl_PL', NumberFormatter::CURRENCY);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_UP); // up seems wrong
//        $formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_DOWN); // or down which seems OK?

$internationalCurrencySymbol = $formatter->getSymbol(NumberFormatter::INTL_CURRENCY_SYMBOL);

return $formatter->formatCurrency($price, $internationalCurrencySymbol);
}
}
Следующее дает мне красивые цены.
Если моя промежуточная сумма равна 9104,6640, это дает мне 9 104,67 злотых, за налог 2094,0727 я получаю 2 094,08 злотых, но для общей суммы 11198,7367 я получаю 11 198,74 злотых ‼️ когда я NumberFormatter::ROUND_UP.
Однако, когда я использую NumberFormatter::ROUND_DOWN const, я получаю 11 198,73 злотых (он также округляет промежуточный итог с 9 104,67 злотых до 9 104,66 злотых zł).
Пожалуйста, помогите мне понять, как мне округлять, поскольку в данном конкретном случае я считаю, что округление в меньшую сторону является правильным, потому что, когда я вручную суммирую на калькуляторе, он показывает 73 "цента", а не 74.
Изображение

Где я допустил ошибку?>
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»