我正在尝试在将销售输入数据库后重新计算销售税。我可以在将信息存储到数据库之前正确地计算出这些信息,但是由于舍入误差,从数据库中计算出用于报告目的的信息被证明是很麻烦的。
该应用程序显示一个界面,允许添加项目并查看小计、税金和总计。
示例输入:
项目 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/