金额处理

金额计算

使用bcmath高精度计算,而不是常规的 +-*÷

注:对于财务、记账类系统来说,金额通常保留两位小数;

// 加法
$sum = bcadd('100.55', '200.45', 2); // 结果: 301.00

// 减法
$diff = bcsub('300.00', '99.99', 2); // 结果: 200.01

// 乘法
$total = bcmul('88.88', '1.05', 2); // 结果: 93.32

// 除法
$unit = bcdiv('100.00', '3', 2); // 结果: 33.33

可以封闭为工具类,如下:

class Money
{
    public static function add(string $a, string $b): string {
        return bcadd($a, $b, 2);
    }

    public static function sub(string $a, string $b): string {
        return bcsub($a, $b, 2);
    }

    public static function mul(string $a, string $b): string {
        return bcmul($a, $b, 2);
    }

    public static function div(string $a, string $b): string {
        return bcdiv($a, $b, 2);
    }
}

金额比较

// 不安全的比较方式
if (0.1 + 0.2 == 0.3) { // 可能返回false
    // ...
}

// 安全的比较方式
if (bccomp(bcadd('0.1', '0.2', 2), '0.3', 2) === 0) {
    // 相等时的处理
}

金额格式化

使用PHP内置函数正确来格式化金额显示

$amount = '1234567.89';
$formattedAmount = number_format($amount, 2, '.', ',');
echo $formattedAmount; // 输出:1,234,567.89

金额存储

数据库使用DECIMAL 保存金额,而不是FLOAT 或 DOUBLE 

`amount` DECIMAL(20,2) NOT NULL DEFAULT 0.00 COMMENT '金额(人民币,单位元)'

满足审计要求

金额相关的系统必须满足审计要求,尤其是财务系统、记账类系统;即,要记录“谁操作了多少钱、操作前后金额是多少”,如果没有审计,就是系统缺陷。

举报

© 著作权归作者所有


0