jjzjj

php - 电子商务网站的货币转换 - 防止因四舍五入而导致购物车总数不正确

coder 2024-04-29 原文

我正在为电子商务应用程序添加多币种支持。我解决这个问题的方法是将应用程序保持在它的基础货币中,并让模板在显示价格时随时调用 priceDisplay() 函数/插件。因此,模板继续接收以美元为单位的价格。 priceDisplay 函数可根据需要正确转换价格,并根据存储在 session 中的观众设置添加正确的 $ 或欧元符号。在提交订单时,应用程序将以美元金额以及货币代码和货币汇率存储订单。此外,我们将以客户的货币向他们的信用卡收费,以确保他们收到的账单与订单屏幕上显示的完全一致。

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

小计:9.75
船:5.95
总计:15.70

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

小计:10.725 -> 10.73
船:6.545 -> 6.55
总计:17.27

可以看到小计+ship = 17.28,但是合计是17.27。

我认为有几个选项可行,尽管没有经过深思熟虑:

  1. 在应用端处理所有转换
  2. 如果要对项目进行总计,模板应将所有单独的加数和总计以基础货币形式发送到 priceDisplay 函数,该函数将对它们进行转换并确保转换后的总计加数之和匹配。在这种情况下,我该如何告知应用程序总金额不是 15.70 而可能是 15.71 或 15.69(因为我们将以基础货币存储订单并在处理付款时乘以汇率。)
  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

最佳答案

我坚定地站在第一阵营。货币换算是核心业务逻辑,属于您的模型,而不属于您的 View 。

此外,虽然钱看起来像 float ,但它不是。无论您的基本单位是什么,金钱都会以整数形式易手。例如,在美国,如果口香糖每个 10 美分,我买了 10 个,那么我用 100 美分换了 10 个口香糖。即使我给出一美元钞票,从软件的角度来看,最好将其计为 100 便士。

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

  • Quantity (有一些钱示例代码)
  • Money (主要是指向他的书)

如果您需要会计工作,我也会与会计交谈。汇率变化、奇怪的费用和其他无稽之谈通常会使货币兑换变得复杂,如果您不能从一开始就做好准备,您可能会花很长时间去追逐金钱以实现收支平衡。

关于php - 电子商务网站的货币转换 - 防止因四舍五入而导致购物车总数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144653/

有关php - 电子商务网站的货币转换 - 防止因四舍五入而导致购物车总数不正确的更多相关文章

  1. ruby-on-rails - Rails 3.2 防止使用错误保存对象 - 2

    我有一个ActiveRecord对象,我想在不对模型进行永久验证的情况下阻止它被保存。您过去可以使用errors.add执行类似的操作,但它看起来不再有效了。user=User.lastuser.errors.add:name,"namedoesn'trhymewithorange"user.valid?#=>trueuser.save#=>true或user=User.lastuser.errors.add:base,"myuniqueerror"user.valid?#=>trueuser.save#=>true如何在不修改用户对象模型的情况下防止将用户对象保存在Rails3.2中

  2. ruby-on-rails - 验证电子邮件地址是 Paypal 用户 - 2

    我想验证一个电子邮件地址是否是PayPal用户。是否有API调用来执行此操作?是否有执行此操作的ruby​​库?谢谢 最佳答案 GetVerifiedStatus来自PayPal'sAdaptiveAccounts平台会为您做这件事。PayPal没有任何codesamples或SDKs用于Ruby中的自适应帐户,但我确实找到了编写codeforGetVerifiedStatusinRuby的人.您需要更改该代码以检查他们拥有的帐户类型的唯一更改是更改if@xml['accountStatus']!=nilaccount_status

  3. ruby-on-rails - Ruby on Rails - 需要在每周的特定时间将消息发送到电子邮件 - 2

    我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用ruby​​onrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_

  4. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  5. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  6. ruby-on-rails - Ruby On Rails,周数不正确 (-1) - 2

    我需要当前周数,如果我没有完全弄错的话现在是第51周?然而,当在控制台中测试它时,我得到了这个。Time.now=>2013-12-1911:08:25+0100Time.now.strftime('%U')=>"50"Date.today=>Thu,19Dec2013Date.today.strftime("%U").to_i=>50这是为什么? 最佳答案 Time.now.strftime('%V')将根据ISO8601为您提供周数。 关于ruby-on-rails-RubyOnRa

  7. ruby - 使用ruby mail gem获取电子邮件正文而不获取附件 - 2

    我正在尝试使用IMAP和ruby​​mailgem获取gmail的正文。当我按照anotherstackoverflowanswer.中的描述获取RFC822字段时,它工作得很好.Fiedl很好地描述了这种方法answer类似的问题。这种方法很棒,只是它需要获取RFC822,而RFC822也会获取所有附件。是否有任何其他领域或其他方法我可以采取不获取附件但仍然使用ruby​​mailgem来获得解码良好的正文? 最佳答案 您必须解析并理解返回的BODYSTRUCTURE响应的实际结构,请参阅RFC3501,p.56.还要记住应用相关

  8. ruby - 使用 S/MIME 在 Ruby 中对电子邮件进行数字签名 - 2

    Ruby中是否有一种方法可以使用S/MIME对电子邮件消息进行数字签名?我们的团队使用PKI,我们的用户习惯于期待重要消息的数字签名。我知道我可以调用openssl命令行工具:opensslsmime-sign-signer$CERT_FILE-passinpass:$CERT_PASS-in$UNSIGNED_MAIL-out$SIGNED_MAIL-certfile$CERT_CA_FILE-from'your'-to'recipients'-subject'TheSubject'但我希望利用Ruby解决方案。 最佳答案 我最终

  9. ruby-on-rails - 如何防止错误 "code converter not found (UTF-8)"? - 2

    我在生产环境(CentOS5.6)中遇到此错误,但在开发环境(Ubuntu11.04)中运行良好。在这两种环境中,该应用程序都使用Ruby1.9.3和Rails3.0.9,并由passenger和nginx提供服务。我的Mechanizegem版本是2.3。未找到代码转换器(UTF-8)此代码的最后一行触发它:mech=Mechanize.newpage=mech.get("http://myurl.com/login.php?login_name=a&password=b")form=page.form_with(:name=>"loginForm")form.field_with(

  10. ruby-on-rails - 如何向 Ruby on Rails Spree 商务应用程序添加新 View ? - 2

    我似乎无法解决的一个非常基本的问题是如何向我的RubyonRailsSpree商务应用程序添加一个新View。我想要做的是在_main_nav_bar.html.erb中的主页链接旁边有一个链接,当您单击它时,它会在显示产品的地方显示一个关于页面。所以:homeaboutcart---------------------thingsoftheHOMEpage---------------------footer点击关于导致:homeaboutcart---------------------thingsoftheABOUTpage---------------------footer在

随机推荐