Как ввести цены подсказки в PHP?
Моя примерная функция:
function dividePrice(float $a, float $b) : float
{
return $a / $b;
}
echo dividePrice(132.32, 23.24);
Этот результат: 5.6936316695353
Безопасно ли и хорошо ли рассчитано, если я использую float для подсказки типов? Если не float, как это сделать?
Только доллары. В БД должно быть как десятичное, а в PHP?






Числа с плавающей запятой имеют неотъемлемые проблемы округления, поскольку многие десятичные числа не могут быть представлены точно с плавающей запятой, и представляют собой только близкие приближения.
Для представления денег в 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 для представления денег в центах (хотя с делением все равно нужно быть осторожным). Но я могу только посоветовать вам использовать хорошо зарекомендовавшую себя библиотеку, чтобы сделать ваш код более читабельным и менее подверженным ошибкам.
Какие цены? В некоторых валютах нет десятичных знаков или даже дробных чисел. Если только в долларах США, то цена будет плавающей, как бы вы ни смотрели на нее, и вам просто нужно принудительно округлить до строки или ограниченной десятичной длины (при хранении в db).