在 MySQL 和 PHP 中处理货币时如何处理精度

How to handle precision when dealing with currency in MySQL and PHP

我在发票中有三个字段 table:

subtotal    decimal(12,4)
tax_amount  decimal(12,4)
total       decimal(12,4)

我 运行 遇到了舍入问题。所以有一张发票具有以下值。添加相加,但在显示发票数据并为发票生成 pdf 时,显示的数据并不总是相加。

           stored value     displayed (rounded)
                                value
subtotal    165.1610         165.16 
tax_amount  24.7742          24.77
total       189.9352         189.94

存储的值相加。 total 列是通过在 PHP 中添加 subtotaltax_amount 值计算得出的。四舍五入是正确的,但是 165.16 + 24.77 = 189.93 而不是 189.94.

我该如何处理这些情况?情况并非总是如此。

将存储的值四舍五入到最接近的便士。当您使用 PHP 计算总计或小计时,对 四舍五入的 值求和。

如果您要以某种方式显示舍入聚合,最好以完全相同的方式计算它以避免混淆。

可以将聚合项显示为未四舍五入,然后为了显示目的对最终总和进行四舍五入。如果您在数据库中存储小数便士,这可能在长 运行 中发挥得更好。

另一种选择是在发票上收取舍入费用以解决差异,尽管这可能会使某些人感到困惑。

也就是说,从编程的角度来说,最好尽可能避免小数便士。

Whatever you choose to do, be consistent!