电子商务网站的货币转换 - 由于四舍五入而防止错误的总购物车

时间:2009-07-17 17:26:05

标签: php e-commerce

我正在为电子商务应用添加多种货币支持。我解决问题的方法是将应用程序保留在它的基础货币中,并让模板在显示价格时随时调用priceDisplay()函数/插件。因此模板继续以美元金额收取价格。 priceDisplay函数在需要时正确转换价格,并根据存储在会话中的查看器设置添加正确的$或Euro符号。在订单提交时,应用程序将以美元金额以及currencyCode和currencyRate存储订单。此外,我们将以其货币向客户的信用卡收费,以确保他们能够准确地收到订单屏幕上显示的信息。

现在我遇到的问题是在购物车中以及结帐时显示购物车总数。例如,应用程序向模板发送要在购物车中显示的价格:

小计:9.75
船:5.95
总计:15.70

模板获取这些金额并在每个项目上调用priceDisplay函数。如果货币汇率为1.1,那么我们会向用户显示:

小计:10.725 - > 10.73
发货:6.545 - > 6.55
总计:17.27

你可以看到小计+船舶= 17.28,但转换的总数是17.27。

我认为可以使用的几个选项虽然没有全部考虑过:

  1. 处理应用程序端的所有转换
  2. 如果项目总计,模板应将所有单独的加数和总数以基础货币一起发送到priceDisplay函数,该函数将转换它们并确保转换后的总数加数之和匹配。在这种情况下,那么我如何与应用程序通信总数不是15.70但可能是15.71或15.69(因为我们将以基础货币存储订单并在处理付款时乘以exchangeRate。)
  3. 跟踪已弃用/添加的小数点作为转化的一部分,并使用它做一些“聪明”的事情。所以在这个例子中,10.725,我们增加了千分之五。因此,当我们转换6.545时,我们应首先降低.005然后转换。也许这是上面选项2的过程吗?
  4. 你的建议在这里。
  5. 如果它有任何区别,应用程序是PHP,模板是Smarty。

    您还可以在添加购物车商品的行总数时看到相同的问题:
    3项x 9.75每个= 29.25
    转换:
    3项x 10.73(10.725)= 32.18(32.175)
    但是3 x 10.73 = 32.19!= 32.18

4 个答案:

答案 0 :(得分:5)

我坚定地参加了一个阵营。货币转换是核心业务逻辑,属于您的模型,而不属于您的观点。

此外,虽然钱看起来像浮点数,但事实并非如此。无论你的基本单位是什么,钱都会以整数量换手。例如,在美国,如果口香糖是10美分,我买10,那么我交易100便士10口香糖。即使我从软件角度给出一美元钞票,最好将其计为100便士。

有关详情,请参阅Martin Fowler的"Patterns of Enterprise Application Architecture""Analysis Patterns"。他详细讨论了所有问题并提供了很好的示例代码。您还可以在网上找到一些信息:

  • Quantity(带一些钱样本代码)
  • Money(主要是指向他书中的指针)

如果你需要会计工作,我也会和会计师谈谈。货币兑换通常会因费率,奇怪的费用和其他废话而变得复杂,如果你从一开始就没有把它弄好,你可以花很长时间追逐便士来使账面保持平衡。

答案 1 :(得分:1)

如果您根据转换后的货币进行结算,那么您实际上不应该在视图逻辑中进行计算。

答案 2 :(得分:0)

个人而言,我只会将总金额,小计加到船舶金额上。这显然是最简单的使用方法,没有人会错过额外的便士。

答案 3 :(得分:0)

永远不要使用浮点数来赚钱!你无缘无故地让自己进入一个受伤的世界。由于PHP没有小数定点类型,所以使用整数进行所有货币计算。见威廉的链接。

相关问题