0
有没有什么办法告诉默认的ruby JSON库来解析非整数值作为字符串(或BigDecimal?)而不是浮动?Ruby JSON解析非整数作为字符串(或BigDecimal)
即JSON.parse('{"foo": 123.45}')['foo'].class
输出Float
,这可能导致精度的问题。
PD:辛普森库支持加载这些值作为BigDecimals的。
有没有什么办法告诉默认的ruby JSON库来解析非整数值作为字符串(或BigDecimal?)而不是浮动?Ruby JSON解析非整数作为字符串(或BigDecimal)
即JSON.parse('{"foo": 123.45}')['foo'].class
输出Float
,这可能导致精度的问题。
PD:辛普森库支持加载这些值作为BigDecimals的。
理论上JSON作为一个容器可以容纳高度精确的数字,但在实践中一端通常仅限于IEEE 754双精度浮点数因为这是JavaScript的本身是有限的。如果值是使用JavaScript或几乎任何JSON实现编码的,则任何精度损失都将已发生。
因此,从解析Float
转换为BigDecimal
几乎总是导致不精密额外损失:
data = JSON.parse("[1.025]")
# Float can't represent decimal values precisely, so `round` fails
data.first.round(2) # => 1.02
# Converting to big decimal improves the precision of future operations
BigDecimal.new(data.first.to_s).round(2).to_s # => "1.03"
你好得多运输的高度精确的值作为字符串。
最后,如果你真的需要Ruby库总是可以猴子打补丁的行为你怎么想。