首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算价格(包括外币税)的正确方法

计算价格(包括外币税)的正确方法
EN

Stack Overflow用户
提问于 2017-12-07 17:18:40
回答 3查看 441关注 0票数 6

我正在试图升级一个应用程序,以便我可以销售到多个国家。我把我所有的价格都存储在数据库中,不包括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,所以它没有正确的总结。

我把这件事做好很重要,因为你可以看到,我会以便士问题收场。如果有人能让我知道哪条路是正确的,或者如果没有一个是正确的,我会很感激。谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-17 15:04:44

由于除了Exchange Rate之外,所有变量都是四舍五入的,所以我们可以编写这样的测试:

代码语言:javascript
复制
// 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;

其中有这样的输出:

代码语言:javascript
复制
107.988   // Test #1 <--- This is amount that needs to be paid to you and Great Britain
107.99    // Test #2 <--- rounded

现在,很明显,数量是不同的,那么应该选择哪一个呢?因为你是从英国收取一件物品,你期望得到你所要求的全部金额,以英镑,所以让我们依赖这个因素。最后,如果我的理解正确的话,顾客必须支付的税就是对英国的税。

让我们以外币检查最终价格:

代码语言:javascript
复制
$totalPrice = round($totalPrice * $exchangeRate,2);
$totalPriceRounded = round($totalPriceRounded * $exchangeRate,2);

echo $totalPrice.'<br/>'.$totalPriceRounded;

其中有这样的输出:

代码语言:javascript
复制
// Amount in foreign currency
161.98      // Test #1
161.99      // Test #2

尽管如此,当从外币计算回GBP时,让我们检查其中哪个值最接近于GBP

代码语言:javascript
复制
// To calculate the totalPrice back to price*tax*quantity in GBP
$totalPrice /= $exchangeRate;
$totalPriceRounded /= $exchangeRate;

echo $totalPrice.'<br/>'.$totalPriceRounded;

其产出如下:

代码语言:javascript
复制
// totalPrice in GBP currency
107.98666666667       // Test #1
107.99333333333       // Test #2

当我们按税收除法时:

代码语言:javascript
复制
$totalPrice /= $tax;
$totalPriceRounded /= $tax;

echo $totalPrice.'<br/>'.$totalPriceRounded;

产出如下:

代码语言:javascript
复制
// 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。那么,您的损失/收益的期望值接近于零。购买越多,就越接近于零。因此,无论采用何种方法,您都不会在这里失去任何东西。一次你赢了,一次你输了。

在我看来,我会把它标准化,使之四舍五入:

代码语言:javascript
复制
$price = 4.47;
$quantity = 1.2    // lets say liters

// Even round the price before applying tax
$totalPrice = round($price * $quantity, 2);

因为如果你被迫展示所有不同的计算阶段,那么你将不得不绕开每一步。

但最准确的做法是在信息丢失最少的情况下使用这一方法:

代码语言:javascript
复制
// Round once at end
$totalPrice = round($price*$quantity*$tax*$exchangeRate, 2);

最后,这一切都取决于你如何设置你的产品价格,或者你的定价工作如何能够选择哪一种方法。我想这并不重要,我认为每一家公司都会选择最适合他们的东西。

在法律上,有些国家/城市/等有法律规定如何计算这一点,你应该看看英国的法律来检查你的问题的有效程序。

票数 1
EN

Stack Overflow用户

发布于 2017-12-15 19:37:44

我不能告诉你正确的选项是什么,或者即使有一个正确的选项。但根据经验,我可以说,如果有多种选择来做一件事,让它在您的软件中可配置。在这种情况下,您可以很容易地使用战略模式并使计算价格的策略可配置。客户可以选择他们想要的计算方法。

票数 1
EN

Stack Overflow用户

发布于 2017-12-17 01:08:08

正确的解决方案取决于您的业务。当你在不同的国家销售商品时,你很可能在这些国家有分支机构--你需要一个以这些国家的货币为单位的净价。这将导致每一项目的净价格“换算”成外币,然后将该净价与数额相乘,再乘以税收系数/百分比)。

欧盟的MOSS (当你在其他国家提供服务时收取费用,或者像下载软件一样)有一些不同。你可以以英镑的价格出售产品,但必须考虑到消费者的当地税收因素。参见例如en.pdf

对于MOSS,我没有详细检查,但我希望您有一个不同的公式,使用您当地的每项净价,乘以金额,乘以消费税百分比。这个税额,仍然是英镑,然后应该与货币汇率相乘,我想。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47700405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档