Ruby 红宝石轮数和贝宝税计算

Ruby 红宝石轮数和贝宝税计算,ruby,paypal,floating-point,decimal,currency,Ruby,Paypal,Floating Point,Decimal,Currency,我在计算税收时遇到了四舍五入的问题 例如,金额为2.12,税率为20%,我计算如下: # this is on Numeric class def ceil_money (self * 100).ceil / 100.0 end ... amount = "2.12" ((Float(amount.to_f) * Float("20.0"))/100).ceil_money 结果是0.43 我必须向贝宝发送税率和税额,他似乎忽略了我的税额,并根据税率计算税额。但我遇到的问题是,在付款

我在计算税收时遇到了四舍五入的问题

例如,金额为2.12,税率为20%,我计算如下:

# this is on Numeric class
def ceil_money
    (self * 100).ceil / 100.0
end

...
amount = "2.12"
((Float(amount.to_f) * Float("20.0"))/100).ceil_money
结果是0.43

我必须向贝宝发送税率和税额,他似乎忽略了我的税额,并根据税率计算税额。但我遇到的问题是,在付款确认消息中,我收到的税款金额为0.42,似乎他们将其四舍五入

我想知道什么是正确的程序来计算税收,向上取整,向下取整


关于这个主题还有其他建议吗?

我会使用Ruby内置的BigDecimal来获得更精确的舍入:

require 'big_decimal'

amount = BigDecimal.new('2.12')
tax_rate = 0.2

(amount * tax_rate).round(2).to_f #=> 0.42
然而,在这种情况下,我认为是您自己的舍入方法导致了问题,因为:

amount = 2.12
tax_rate = 0.2

(amount * tax_rate).round(2) #=> 0.42

很可能只是四舍五入,但您需要与PayPal再次核实。2.12的20%是0.424,这将四舍五入到0.42.Floatamount.to_f-可能乘以1.0以确保它是一个真正的浮点:请不要使用浮点:您正在尝试对一个十进制数的二进制近似值进行十进制四舍五入。这使得边界情况的舍入方向基本上不可预测,而且听起来您需要一个可预测的解决方案。改为使用十进制定点或浮点类型,或整数算术。要提供@MarkDickinson备注的另一种理解,将税款添加到货币金额时的舍入操作以十进制指定。你应该完全按照这些步骤来做。即使使用整数运算,也需要小心。如果使用十进制定点,则定点系统恰好与税收计算规则完全匹配(在这种情况下,它很简单),或者不匹配(在这种情况下,它也需要小心)。编程中没有什么是不可能的,但使用二进制浮点或错误的十进制定点系统进行编程需要特殊技能。