我正在为电子商务应用添加多种货币支持。我解决问题的方法是将应用程序保留在它的基础货币中,并让模板在显示价格时随时调用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。
我认为可以使用的几个选项虽然没有全部考虑过:
如果它有任何区别,应用程序是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
答案 0 :(得分:5)
我坚定地参加了一个阵营。货币转换是核心业务逻辑,属于您的模型,而不属于您的观点。
此外,虽然钱看起来像浮点数,但事实并非如此。无论你的基本单位是什么,钱都会以整数量换手。例如,在美国,如果口香糖是10美分,我买10,那么我交易100便士10口香糖。即使我从软件角度给出一美元钞票,最好将其计为100便士。
有关详情,请参阅Martin Fowler的"Patterns of Enterprise Application Architecture"和"Analysis Patterns"。他详细讨论了所有问题并提供了很好的示例代码。您还可以在网上找到一些信息:
如果你需要会计工作,我也会和会计师谈谈。货币兑换通常会因费率,奇怪的费用和其他废话而变得复杂,如果你从一开始就没有把它弄好,你可以花很长时间追逐便士来使账面保持平衡。
答案 1 :(得分:1)
如果您根据转换后的货币进行结算,那么您实际上不应该在视图逻辑中进行计算。
答案 2 :(得分:0)
个人而言,我只会将总金额,小计加到船舶金额上。这显然是最简单的使用方法,没有人会错过额外的便士。
答案 3 :(得分:0)
永远不要使用浮点数来赚钱!你无缘无故地让自己进入一个受伤的世界。由于PHP没有小数定点类型,所以使用整数进行所有货币计算。见威廉的链接。