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庫總是可以猴子打補丁的行爲你怎麼想。