Ruby提供了一種BigDecimal
類型。BigDecimal
專門用于處理高精度的浮點數運算,在運算過程中不會丟失浮點數的精度。BigDecimal
特別適合用于處理對錢的運算。
但是BigDecimal類型如何做json序列化?
這是一個值得討論的問題, 例如下面代碼:
require 'bigdecimal'
require 'json'
{
price: BigDecimal.new('10000.000001')
}.to_json
price 會被序列化成string, 而不會是numeric:
{"price":"0.10000000001E5"}
為什么不會是numeric ?
如果我們將price:BigDecimal
作為numeric
傳輸后,在某些語言中,或者json庫中,會將price當做float或者double類型進行from_json
. 此時很有可能會丟失price數據的精度。
為了使BigDecimal
數據在傳輸的過程中不會造成數據精度的損失,ruby會采用string類型對BigDecimal
進行序列化。當客戶端接受到string數據后,手動對price數據進行處理。