我正在试图升级一个应用程序,以便我可以销售到多个国家。我把我所有的价格都存储在数据库中,不包括4dp的税金,我需要用本国的货币计算价格,包括税金。
我是将价格乘以汇率与不含税的价格(选项1),还是计算包括税收在内的金额,然后乘以汇率(选项2)?在查看了OpenCart如何计算它之后,我还添加了一个选项3,它类似于选项2,但只有在显示它时才会循环。以下是所有三个选项的公式:
备选案文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,所以它没有正确的总结。
我把这件事做好很重要,因为你可以看到,我会以便士问题收场。如果有人能让我知道哪条路是正确的,或者如果没有一个是正确的,我会很感激。谢谢
发布于 2017-12-17 15:04:44
由于除了Exchange Rate之外,所有变量都是四舍五入的,所以我们可以编写这样的测试:
// 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;其中有这样的输出:
107.988 // Test #1 <--- This is amount that needs to be paid to you and Great Britain
107.99 // Test #2 <--- rounded现在,很明显,数量是不同的,那么应该选择哪一个呢?因为你是从英国收取一件物品,你期望得到你所要求的全部金额,以英镑,所以让我们依赖这个因素。最后,如果我的理解正确的话,顾客必须支付的税就是对英国的税。
让我们以外币检查最终价格:
$totalPrice = round($totalPrice * $exchangeRate,2);
$totalPriceRounded = round($totalPriceRounded * $exchangeRate,2);
echo $totalPrice.'<br/>'.$totalPriceRounded;其中有这样的输出:
// Amount in foreign currency
161.98 // Test #1
161.99 // Test #2尽管如此,当从外币计算回GBP时,让我们检查其中哪个值最接近于GBP。
// To calculate the totalPrice back to price*tax*quantity in GBP
$totalPrice /= $exchangeRate;
$totalPriceRounded /= $exchangeRate;
echo $totalPrice.'<br/>'.$totalPriceRounded;其产出如下:
// totalPrice in GBP currency
107.98666666667 // Test #1
107.99333333333 // Test #2当我们按税收除法时:
$totalPrice /= $tax;
$totalPriceRounded /= $tax;
echo $totalPrice.'<br/>'.$totalPriceRounded;产出如下:
// the amount you get in GBP currency
89.988888888889 // End result of Test #1
89.994444444444 // End result of Test #2因此,正如您所看到的,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);因为如果你被迫展示所有不同的计算阶段,那么你将不得不绕开每一步。
但最准确的做法是在信息丢失最少的情况下使用这一方法:
// Round once at end
$totalPrice = round($price*$quantity*$tax*$exchangeRate, 2);最后,这一切都取决于你如何设置你的产品价格,或者你的定价工作如何能够选择哪一种方法。我想这并不重要,我认为每一家公司都会选择最适合他们的东西。
在法律上,有些国家/城市/等有法律规定如何计算这一点,你应该看看英国的法律来检查你的问题的有效程序。
发布于 2017-12-15 19:37:44
我不能告诉你正确的选项是什么,或者即使有一个正确的选项。但根据经验,我可以说,如果有多种选择来做一件事,让它在您的软件中可配置。在这种情况下,您可以很容易地使用战略模式并使计算价格的策略可配置。客户可以选择他们想要的计算方法。
发布于 2017-12-17 01:08:08
正确的解决方案取决于您的业务。当你在不同的国家销售商品时,你很可能在这些国家有分支机构--你需要一个以这些国家的货币为单位的净价。这将导致每一项目的净价格“换算”成外币,然后将该净价与数额相乘,再乘以税收系数/百分比)。
欧盟的MOSS (当你在其他国家提供服务时收取费用,或者像下载软件一样)有一些不同。你可以以英镑的价格出售产品,但必须考虑到消费者的当地税收因素。参见例如en.pdf
对于MOSS,我没有详细检查,但我希望您有一个不同的公式,使用您当地的每项净价,乘以金额,乘以消费税百分比。这个税额,仍然是英镑,然后应该与货币汇率相乘,我想。
https://stackoverflow.com/questions/47700405
复制相似问题