Как ввести подсказку цены? - PullRequest
0 голосов
/ 17 ноября 2018

Как вводить цены подсказок в PHP?

Мой пример функции:

function dividePrice(float $a, float $b) : float
{
    return $a / $b;
}

echo dividePrice(132.32, 23.24);

Это возвращение: 5.6936316695353

Безопасно и хорошо ли рассчитано, если я использую floatдля типа намека?Если не плавать, как это сделать?

1 Ответ

0 голосов
/ 18 ноября 2018

Числа с плавающей запятой имеют проблемы с округлением, так как многие десятичные числа не могут быть представлены точно в плавающей запятой, и представляют собой только близкие приближения .


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

...