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

saf*_*foo 3 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. 你的建议在这里.

如果它有任何区别,应用程序是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

Wil*_*tri 5

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

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

有关这方面的更多信息,请参阅Martin Fowler的"企业应用程序架构模式""分析模式".他详细讨论了所有问题并提供了很好的示例代码.您还可以在网上找到一些信息:

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

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