Как ввести подсказки цены в PHP?
Мой пример функции:
function dividePrice(float $a, float $b) : float
{
return $a / $b;
}
echo dividePrice(132.32, 23.24);
Это возвращение: 5.6936316695353
Это безопасно и хорошо рассчитано, если я использую float для подсказок типа? Если не плавать, как это сделать?
Числа с плавающей запятой имеют проблемы с округлением, так как многие десятичные числа не могут быть представлены точно в плавающей запятой и являются только близкие приближения.
Чтобы представлять деньги в PHP, я могу только посоветовать использовать правильную библиотеку денег, которая выполняет точные вычисления и явно обрабатывает округления.
Пример с кирпич / деньги, библиотека, которую я создал:
use Brick\Money\Money;
use Brick\Math\RoundingMode;
$money = Money::of('132.32', 'USD');
echo $money->dividedBy('23.24', RoundingMode::HALF_UP); // USD 5.69
Эта библиотека основана на кирпич / математика, библиотека, которая выполняет точные вычисления над числами любого размера. Вы также можете использовать brick/math
библиотека напрямую для передачи точных десятичных чисел в вашем коде:
use Brick\Math\BigDecimal;
use Brick\Math\RoundingMode;
$a = BigDecimal::of('132.32');
$b = BigDecimal::of('23.24');
// Dividing to 2 decimals
echo $a->dividedBy($b, 2, RoundingMode::HALF_UP); // 5.69
// Dividing to 20 decimals
echo $a->dividedBy($b, 20, RoundingMode::HALF_UP); // 5.69363166953528399312
Повторюсь, поплавки предназначены для выполнения приближенный расчеты. Не используйте их для обработки денег.
Альтернативой было бы использовать int
представлять деньги в центах (хотя вы все равно должны быть осторожны с делением). Но я могу только призвать вас использовать хорошо зарекомендовавшую себя библиотеку, чтобы сделать ваш код более читабельным и менее подверженным ошибкам.
Других решений пока нет …