使用Mysql和php正确计算税收

时间:2014-02-06 02:14:40

标签: 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,百分比:2.90

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

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

sale_id:1,item_id:1,百分比: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,百分比: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.04时,输出为1.03。此查询在大多数情况下都有效,但在出现舍入问题时会失败很多。

我需要能够使用sql准确地生成摘要信息。我对在销售前和数据库中如何计算信息的任何建议持开放态度。

2 个答案:

答案 0 :(得分:3)

好的,所以,你的问题,正如我所理解的那样与编程没什么关系。

所以,你有一个价值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

看看这里发生了什么?

现在,这些方法中的哪一种是正确的?如果您实际上需要与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)

答案 1 :(得分:0)

很抱歉回答,因为评论无法正确显示代码。

怎么样

(SELECT ROUND(SUM(tax)/100,2) FROM (SELECT item_unit_price*SUM(percent) 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)

你可以将表导出为sql,所以我可以试试我的本地?如果没有什么太机密。