PHP:计算应用于产品的百分比税

PHP:计算应用于产品的百分比税,php,rounding,Php,Rounding,由于四舍五入,我在计算产品的百分比税时遇到了一个重大问题 例如: 如果您的产品价格为1.00英镑(含20%的税费),细分如下: 0.83 ex tax 0.17 tax 1.00 total 但是,如果计算出增加的百分比: round( (( ( 1 - 0.83 ) / 0.83 ) * 100), 2); 答案是20.48,因为增值税的实际价格是0.8333333 因此,如果您计算: round( (( ( 1 - 0.8333333333 ) /0.8333333333 ) * 100

由于四舍五入,我在计算产品的百分比税时遇到了一个重大问题

例如:

如果您的产品价格为1.00英镑(含20%的税费),细分如下:

0.83 ex tax
0.17 tax
1.00 total
但是,如果计算出增加的百分比:

round( (( ( 1 - 0.83 ) / 0.83 ) * 100), 2);
答案是
20.48
,因为增值税的实际价格是
0.8333333

因此,如果您计算:

round( (( ( 1 - 0.8333333333 ) /0.8333333333 ) * 100), 2);
您得到了
20
的正确答案

在这种情况下,将
20.48
四舍五入到
20
显然是可行的,但这不是一个解决方案,因为有些税率是小数点后两位的,所以不能假设您可以将税率四舍五入


我是遗漏了什么,还是在不知道原始税率的情况下这是不可能的?

只要你处理的是低精度的数字,你就会得到低精度的答案。如果必须显示低精度数字,则可以在视图中向用户显示时对其进行四舍五入,但在数据库中将其保存为高精度数字。

只要处理低精度数字,就会得到低精度答案。如果必须显示低精度数字,可以在视图中向用户显示时对其进行四舍五入,但将其保存为数据库中的高精度数字。

0.17
不是
0.83
20%
,因此您的基本假设不准确(四舍五入:p)

不要对钱进行舍入,在不进行舍入的情况下进行计算,如果需要,则显示舍入。这避免了在计算中失去精度

一个简单的测试将证明

$price=0.8333333333;
$taxRate=21.25;
$tax=$price*$taxRate/100;
$total=$price+$tax;
$calculatedTaxRate=(($total-$price)/$price)*100;      // 21.25
由于我们没有到任何地方去,我们可以逆向工程税率一直降到最低

试试20%

$price=0.8333333333;
$taxRate=20;
$tax=$price*$taxRate/100;
$total=$price+$tax;
$calculatedTaxRate=(($total-$price)/$price)*100;      // 20

0.17
不是
0.83
20%
,因此您的基本假设不准确(四舍五入:p)

不要对钱进行舍入,在不进行舍入的情况下进行计算,如果需要,则显示舍入。这避免了在计算中失去精度

一个简单的测试将证明

$price=0.8333333333;
$taxRate=21.25;
$tax=$price*$taxRate/100;
$total=$price+$tax;
$calculatedTaxRate=(($total-$price)/$price)*100;      // 21.25
由于我们没有到任何地方去,我们可以逆向工程税率一直降到最低

试试20%

$price=0.8333333333;
$taxRate=20;
$tax=$price*$taxRate/100;
$total=$price+$tax;
$calculatedTaxRate=(($total-$price)/$price)*100;      // 20

是不是有点像:

17%增值税

85.47免税

85.47x0.17=14.53

总数:100


所以100/1.17=85.47是不是有点像:

17%增值税

85.47免税

85.47x0.17=14.53

总数:100


所以100/1.17=85.47

假设您的总价为1英镑,税率为20%:

$vatDecimal = (float) 1 + (20 / 100);
$priceExclVAT = round((1.00 / $vatDecimal), 2);
$priceDisplay = number_format($priceExclVAT, 2, ',', '.');

echo $priceDisplay;

假设您的总价为1英镑,税率为20%:

$vatDecimal = (float) 1 + (20 / 100);
$priceExclVAT = round((1.00 / $vatDecimal), 2);
$priceDisplay = number_format($priceExclVAT, 2, ',', '.');

echo $priceDisplay;

我的小而肮脏的版本:

$taxrate=22; // 22%
$price=100;
$priceMinusTax=($price/(($taxrate/100)+1));

我的小而肮脏的版本:

$taxrate=22; // 22%
$price=100;
$priceMinusTax=($price/(($taxrate/100)+1));

用户输入总金额和税款。有时它来自数据库,我们也可以使用此代码

$actualPrice        =   "";
$total              =   1000;//User Entry Total Amount
$gst                =   18;//User Entry GST Tax %
$calculateTax       =   100+$gst;
$calculateAmount    =   $total*100;
$actualPrice        =   $calculateAmount/$calculateTax;
echo $actualPrice       =   round($actualPrice,2);
echo $gstAmount         =   round($total-$actualPrice,2);

用户输入总金额和税款。有时它来自数据库,我们也可以使用此代码

$actualPrice        =   "";
$total              =   1000;//User Entry Total Amount
$gst                =   18;//User Entry GST Tax %
$calculateTax       =   100+$gst;
$calculateAmount    =   $total*100;
$actualPrice        =   $calculateAmount/$calculateTax;
echo $actualPrice       =   round($actualPrice,2);
echo $gstAmount         =   round($total-$actualPrice,2);

这很难被认为是一个编程问题。如果你在某一点上降低了精度,你就不能神奇地恢复精度。不管怎样,英国难道没有固定的增值税税率吗?这几乎不能被视为一个规划问题。如果你在某一点上降低了精度,你就不能神奇地恢复精度。不管怎样,英国不是有固定的增值税税率吗?这是一个难题,因为大多数产品都有外部来源的增值税税前和增值税增值。我同意这是最好的解决方案!这是一个困难的问题,因为大多数产品都有外部来源的增值税(ex.vat)和增值税(inc.vat)价值。我同意这是最好的解决方案!难以置信的简单!谢谢,非常简单!谢谢