Числа с плавающей запятой имеют проблемы с округлением, так как многие десятичные числа не могут быть представлены точно в плавающей запятой, и представляют собой только близкие приближения .
Для представления денег вPHP, я могу только посоветовать использовать надлежащую денежную библиотеку, которая выполняет точные вычисления и обрабатывает явное округление.
Пример с brick / money , библиотека, которую я создал:
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 , библиотеке, которая выполняет точные вычисления для чисел любого размера.Вы также можете использовать библиотеку 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
для представления денег в центах (хотя вы все равно должны быть осторожны с делением).Но я могу только призвать вас использовать хорошо зарекомендовавшую себя библиотеку, чтобы сделать ваш код более читабельным и менее подверженным ошибкам.