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

标签 php mysql rounding currency-formatting

我的发票表中有三个字段:

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!

关于php - 在 MySQL 和 PHP 中处理货币时如何处理精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36780953/

相关文章:

php - 预填充的阅读行

PHP 和 MySql 更新

c# - 四舍五入到最接近的五

php - 当用户点击提交按钮时,index.php 不会捕获该操作并更新数据库

php - 在 solr/lucene 中过滤存储在远程数据库中的字段的最佳方法?

mysql - Django 迁移失败,(2013, 'Lost connection to MySQL server at\' 读取初始通信包\')

C#:Math Round() 对于不同的小数会产生不同的值

PHP:Ceil 函数舍入问题

java - 无法转换为 JSONArray 以在 ListView 中显示

mysql - 在 MySQL 中按非标准季度对总计进行分组