小数时的BigDecimal比较值



我正在postgresql数据库中存储数字类型的数据

CREATE TABLE public.subscriptions (
    amount numeric(15,2)
)

但是,当我使用BigDecimal格式的这个量来将其与浮点格式的自身值进行比较时,在某些情况下会失败。除非我把它相乘以避免小数:

subscription.amount == 521.18 #=> false
subscription.amount * 100 == 52118 #=> true

似乎BigDecimal格式是这里的问题(但我不确定它是否完全相同(

BigDecimal(52118)/100 == 521.18 #=> false
BigDecimal(52117)/100 == 521.17 #=> true
BigDecimal(52118) == 52118 #=> true
BigDecimal(52117) == 52117 #=> true

你知道对此有什么解释吗?那么我应该避免将BigDecimal数字与包含小数的浮点数进行比较吗?

非常感谢您的帮助:(

正如评论中所提到的,这是浮点的问题,而不是小数:

irb(main):009:0> 100 * 521.18 == 52118
=> false
irb(main):010:0> 100 * 521.18
=> 52117.99999999999

浮点运算的不精确性是BigDecimals存在的全部原因。在比较之前转换浮动也可以:

irb(main):014:0> "521.18".to_d == 521.18.to_d
=> true

最新更新