我在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数字与包含小数的浮点数进行比较吗?
非常感谢你的帮助:)
发布于 2022-07-22 15:51:00
正如注释中提到的,这是浮点数的一个问题,而不是十进制:
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
=> truehttps://stackoverflow.com/questions/73079159
复制相似问题