正确计算包括外币税在内的价格的方法

nfp*_*lee 6 accounting currency invoice e-commerce tax

我正在尝试升级应用程序,以便我可以销往多个国家/地区.我将所有价格存储在数据库中的英镑不含税,最高可达4dp,我需要计算该国货币的价格,包括税金.

我是否将价格乘以汇率与不含税的价格(选项1)相乘,还是计算包含税的金额,然后用汇率计算多倍(选项2)?在查看OpenCart如何计算它之后,我还添加了一个选项3,它类似于选项2,但在显示它时只会轮次.以下是所有3个选项的公式:

选项1:

回合((价格*汇率)/ 100*(100 +税率))

选项2:

回合(回合(价格/ 100*(100 +税率))*汇率)

选项3:

回合((价格/ 100*(100 +税率))*汇率)

例如,假设我的产品价格为89.99.如果我想用汇率为1.5且税率为20%的货币显示.我会说:

选项1:

回合((89.99*1.5)/ 100*(100 + 20))= 161.98

选项2:

回合(回合(89.99/100*(100 + 20))*1.5)= 161.99

选项3:

回合((89.99/100*(100 + 20))*1.5)= 161.98

我发现OpenCart总是将未计算的数字乘以最后的汇率.例如,他们计算行总数的公式是:

回合((价格/ 100*(100 +税率))*数量*汇率)

因此,如果我要订购我的产品中的3个,它会给出:

回合((89.99/100*(100 + 20))*3*1.5)= 485.95

我发现OpenCart方式的问题是用户将看到项目价格(含税)161.98和总计485.95.但是,如果我说161.98*3我得到485.94,所以它没有正确总结.

重要的是我能做到这一点,因为你可以看到我最终会得到一分钱的问题.如果有人能让我知道哪种方式是正确的,或者如果没有一种方法可以提出替代方案,我将不胜感激.谢谢

Iva*_*n86 1

由于所有变量都是四舍五入的Exchange Rate,除了 ,我希望它通常看起来像这样1.3462,我们可以编写这样的测试:

// I'm guessing you need it in PHP
$price = 89.99;
$quantity = 1;
$tax = 20;
$tax = $tax/100.0 + 1;
// $tax = 1.2
$exchangeRate = 1.5;

$totalPrice = $price*$quantity*$tax;                     // Test #1
$totalPriceRounded = round($price*$quantity*$tax,2);     // Test #2

echo $totalPrice.'<br/>'.$totalPriceRounded;
Run Code Online (Sandbox Code Playgroud)

哪个会有这样的输出:

107.988   // Test #1 <--- This is amount that needs to be paid to you and Great Britain
107.99    // Test #2 <--- rounded
Run Code Online (Sandbox Code Playgroud)

现在,很明显数量上存在差异,那么该选择哪个呢?由于您要对来自英国的商品进行收费,因此您希望收到所需的全部金额(以英镑为单位),因此让我们依靠这个因素。最后,如果我理解正确的话,客户必须缴纳的税款是英国的税款。

让我们检查一下最终的外币价格:

$totalPrice = round($totalPrice * $exchangeRate,2);
$totalPriceRounded = round($totalPriceRounded * $exchangeRate,2);

echo $totalPrice.'<br/>'.$totalPriceRounded;
Run Code Online (Sandbox Code Playgroud)

哪个会有这样的输出:

// Amount in foreign currency
161.98      // Test #1
161.99      // Test #2
Run Code Online (Sandbox Code Playgroud)

话虽如此,让我们检查一下哪一个会返回最接近外币107.988 GBP计算值的值。GBP

// To calculate the totalPrice back to price*tax*quantity in GBP
$totalPrice /= $exchangeRate;
$totalPriceRounded /= $exchangeRate;

echo $totalPrice.'<br/>'.$totalPriceRounded;
Run Code Online (Sandbox Code Playgroud)

其输出为:

// totalPrice in GBP currency
107.98666666667       // Test #1
107.99333333333       // Test #2
Run Code Online (Sandbox Code Playgroud)

当我们除以税收时:

$totalPrice /= $tax;
$totalPriceRounded /= $tax;

echo $totalPrice.'<br/>'.$totalPriceRounded;
Run Code Online (Sandbox Code Playgroud)

输出是:

// the amount you get in GBP currency
89.988888888889    // End result of Test #1
89.994444444444    // End result of Test #2
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,in this case通过使用 的裸露量,round($price*$quantity*$tax*$exchangeRate, 2)您会得到更少的量,但通过使用,round(round($price*$quantity*$tax,2)*$exchangeRate, 2)您会得到更多的量,再次四舍五入后,两者的值相同。在其他一些情况下,差异可能与我们在这里得到的不同,也可能相反。

结论

  • 如果您每种产品的数量都是固定的,fixed prices那么随着时间的推移,您要么会损失金钱(金额微不足道),要么会赚到超出应有的金额(金额也微不足道)。结果取决于每种产品的受欢迎程度和价格(即round函数向上或向下舍入)以及您选择的计算方式。您可以根据产品的受欢迎程度,手动调整每种产品的价格,以最大限度地减少随着时间的推移的损失/收益。

  • 如果您有random prices类似的产品,可以说您正在租赁web servers且价格为$0.01/second。那么你的损失/收益的期望值接近于零。而且购买的次数越多,它就越接近于零。因此,无论采用何种方法,您都不会损失任何东西。一次你赢得一些,一次你失去一些。

在我看来,我会将其标准化以舍入一切:

$price = 4.47;
$quantity = 1.2    // lets say liters

// Even round the price before applying tax
$totalPrice = round($price * $quantity, 2);
Run Code Online (Sandbox Code Playgroud)

因为如果您被迫显示计算的所有不同阶段,那么您将不得不对每个步骤进行舍入。

但最精确的是使用它,因为丢失的信息最少:

// Round once at end
$totalPrice = round($price*$quantity*$tax*$exchangeRate, 2);
Run Code Online (Sandbox Code Playgroud)

最终,这一切都取决于您如何设置产品价格或您的定价方式如何才能选择采用哪种方法。我想说这并不重要,我认为每个公司都会选择最适合自己的。

从法律上讲,某些国家/城市/等。有关于如何计算此值的法律,您应该查看英国法律来检查您的问题的有效程序。