如何输入提示价格?

时间:2018-11-17 15:45:10

标签: php currency floating-point-conversion

如何在PHP中输入提示价格?

我的示例函数:

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

echo dividePrice(132.32, 23.24);

此返回:5.6936316695353

如果我使用float进行类型提示是否安全且计算正确?如果没有浮动怎么办?

1 个答案:

答案 0 :(得分:0)

浮点数具有固有的舍入问题,因为许多十进制数不能精确地用浮点表示,而只能是close approximations


要用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来代表金钱(以美分表示)(不过,除法仍然要格外小心)。但我只能鼓励您使用一个完善的库来使您的代码更具可读性,并且不易出错。