php - 使用 Mysql 和 php 正确计算税金

标签 php mysql

我正在尝试在将销售输入数据库后重新计算销售税。我可以在将信息存储到数据库之前正确地计算出这些信息,但是由于舍入误差,从数据库中计算出用于报告目的的信息被证明是很麻烦的。

该应用程序显示一个界面,允许添加项目并查看小计、税金和总计。

示例输入:

项目 1:9.95

项目 2:2.95

小计:12.90

税收(每件商品可能不同,但现在每件商品都一样)

2.900%:0.37

1.000%:0.13

1.100%: 0.14

3.000%:0.39

税收总额:1.03

总计:13.93

我在存储到数据库之前计算税收的方式:

foreach Item as $price
{
  foreach Tax as $percent
  {
    $taxes[$percent]+=$price*($percent/100);
  }
}

foreach($taxes as $percent => $tax_amount)
{
  $taxes[$percent] = ROUND_TO_2_DECIMALS($tax_amount);
}

计算完所有这些信息后,我将信息存储在数据库中,以后可以检索该数据库以用于报告目的。

示例架构:

phppos_sales_items
- sale_id
- item_id
- price

phppos_sales_items_taxes
- sale_id
- item_id
- tax_percent

phppos_sales_items 表的示例数据

sale_id: 1, item_id: 1, item_unit_price: 9.95

sale_id: 1, item_id: 2, item_unit_price: 2.95

phppos_sales_items_taxes 表的示例数据

sale_id: 1, item_id: 1, percent: 2.90

sale_id: 1, item_id: 1, percent: 1.00

sale_id: 1, item_id: 1, percent: 1.10

sale_id: 1, item_id: 1, percent: 3.00

sale_id:1,item_id:2,百分比:2.90

sale_id:1,item_id:2,百分比:1.00

sale_id:1,item_id:2,百分比:1.10

sale_id: 1, item_id: 2, percent: 3.00

计算销售税的示例查询

(SELECT SUM(tax) FROM (SELECT ROUND((item_unit_price)*(SUM(percent)/100),2) as tax
FROM phppos_sales_items
INNER JOIN phppos_sales_items_taxes USING (sale_id, item_id)
WHERE sale_id = 1
GROUP BY sale_id, item_id) as tax)

当我需要得到 1.03 时,输出是 1.04。此查询在大多数情况下都有效,但在存在舍入问题时会失败很多。

我需要能够使用 sql 准确地生成摘要信息。我愿意接受有关如何在销售前和数据库中计算信息的任何建议。

最佳答案

好的,据我了解,您的问题与编程没有太大关系。

因此,您有一件值(value) 1 美元的元素。现在,你有两种税,一种是 1.4%,另一种是 1.3%。现在,这就是你正在做的事情

tax1 = round($1*0.014, 2) = $0.01
tax2 = round($1*0.013, 2) = $0.01
totaltax = $0.02

到目前为止一切顺利...好的,但现在让我们换一种方式。如果我们把税加起来,我们应该支付总额 1.4 + 1.3 = 2.7%,这意味着:

totaltax = round($1*0.027, 2) = $0.03

看看这里发生了什么?

现在,这些方法中哪一个是正确的?如果你 body 上需要和 tax2 分开缴纳 tax1,那么每一个都以分来量化,第一种方式是正确的。但是,我觉得你很可能只支付最终的总税款,也就是说你先把百分比加起来,计算你的税款,然后支付到最接近的美分。


关于您的代码,您应该得到 1.03,这是正确的,但是您的查询犯了一个类似于第一个变体的错误,它在将每个项目的结果相加之前四舍五入(它正在做 round(price1 *tax1, 2) + round(price2*tax2, 2)). (实际上,为了完整起见,您需要对三个地方进行四舍五入:个税级别、项目级别和合计级别。)

要在末尾取整而不是每个项目,请移出您的 ROUND:

(SELECT ROUND(SUM(tax),2) FROM (SELECT (item_unit_price)*(SUM(percent)/100) as tax
FROM phppos_sales_items
INNER JOIN phppos_sales_items_taxes USING (sale_id, item_id)
WHERE sale_id = 1
GROUP BY sale_id, item_id) as tax)

关于php - 使用 Mysql 和 php 正确计算税金,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21592720/

相关文章:

php - 使用 PHP 通过 IP 地址获取国家/地区、GMT、城市

php - 特定表格行周围的边框

javascript - JQuery 变量没有转移到 JavaScript

php - 用于更新 session 的 Jquery 登录头不起作用

mysql - 如何从周五开始按周分组

PHP:如何保护数字产品(视频、音频、电子书等)免遭未经授权的下载?

MySQL - 如何确定任何给定月份的天数列表

php - 在 Laravel 中构建动态查询 - 如何进行多选项搜索

c# - 如何将 BUTTON 值插入数据库

php - PHP行更新有一个小缺陷