【问题标题】:Ruby/Rails How to Calculate and Round Prices?Ruby/Rails 如何计算和舍入价格?
【发布时间】:2014-02-25 17:17:09
【问题描述】:

在开发发票时,我遇到了数学四舍五入问题,我的单价和总数加起来并不完美。问题的出现是因为业务需求根据特定条件将隐藏的佣金传递给客户。我必须到幕后,将每个价格和总额乘以佣金百分比。

例如未四舍五入的计算价格乘以佣金。

Item            Name         qty    Price2  qty2    Price   Total
Kitchen Counter Uba Tuba     100.0  72.4275 100.0   18.125  9055.249999999999   9055.249999999999
Vanity          Uba Tuba     100.0  72.4275 100.0   18.125  9055.249999999999   9055.249999999999
                                        Grand Total         18110.5

现在使用 rails number_to_currency helper 应用,数字已关闭

Kitchen Counter Uba Tuba     100.0  $72.43  100.0   $18.13  1   $9,055.25   $9,055.25
Vanity          Uba Tuba     100.0  $72.43  100.0   $18.13  1   $9,055.25   $9,055.25

由于价格四舍五入,如果客户自己计算,则总数不正确。

rounded total = $9056.00

你如何以编程方式解决这个问题?

【问题讨论】:

    标签: ruby-on-rails ruby currency


    【解决方案1】:

    也许the moneymoney-rails gems 会有用!

    如果您想手动操作,您应该考虑将价格存储为 Integer 值!其中 x 的价格意味着 x $ 美分或 x 几十美元。通过这样做,您可以摆脱数据库中的所有舍入问题。

    另外,number_to_currency 助手的使用将帮助您将内容正确地显示到您的视图中。

    【讨论】:

    • number_to_currency 是我正在使用的。我会调查你提供的红宝石
    • @ctilley79 ruby​​gems 肯定会帮助你。问题从 ruby​​ 和您的数据库的浮点表示开始。使用浮点数没有“正确”的方法,因为14.0 对于计算机来说总是可以是13.9999999998。另一方面,1400 (Int) 就是这样 :-)
    【解决方案2】:

    如果要消除订单项总计中的舍入误差,则需要在计算总计之前将折扣单价四舍五入到小数点后两位,即

    qty = 100.0
    price = 18.125
    qty2 = 100.00
    price2 = 72.4275
    
    total = qty * price.round(2) + qty2 * price2.round(2)
    total.round(2) # happens in number_to_currency
    #=> 9056.0
    

    而不是你目前正在做的事情

    total = qty * price + qty2 * price2
    total.round(2) # happens in number_to_currency
    #=> 9055.25
    

    【讨论】:

    • 我更喜欢这个。使我不必将 gem 集成到一个几乎完整的项目中。
    • 我仍然同意 @xlembouras 的观点,即您应该使用 Integer 或任意精度浮点数 (BigDecimal) 来表示值。舍入问题可能很难追踪,您也不想处理普通浮点数的不精确性!
    • 请记住,如果希望客户实际支付发票上所列的总金额,则不能只应用此技术。也就是说,四舍五入法的总价为 9,056.00 美元,但实际价格(我假设客户应该支付)为 9,055.25 美元。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多