Ruby提供了一種BigDecimal
類型。BigDecimal
專門用于處理高精度的浮點(diǎn)數(shù)運(yùn)算,在運(yùn)算過程中不會(huì)丟失浮點(diǎn)數(shù)的精度庶近。BigDecimal
特別適合用于處理對(duì)錢的運(yùn)算枢纠。
但是BigDecimal類型如何做json序列化?
這是一個(gè)值得討論的問題, 例如下面代碼:
require 'bigdecimal'
require 'json'
{
price: BigDecimal.new('10000.000001')
}.to_json
price 會(huì)被序列化成string, 而不會(huì)是numeric:
{"price":"0.10000000001E5"}
為什么不會(huì)是numeric ?
如果我們將price:BigDecimal
作為numeric
傳輸后筹裕,在某些語言中,或者json庫中窄驹,會(huì)將price當(dāng)做float或者double類型進(jìn)行from_json
. 此時(shí)很有可能會(huì)丟失price數(shù)據(jù)的精度朝卒。
為了使BigDecimal
數(shù)據(jù)在傳輸?shù)倪^程中不會(huì)造成數(shù)據(jù)精度的損失,ruby會(huì)采用string類型對(duì)BigDecimal
進(jìn)行序列化乐埠。當(dāng)客戶端接受到string數(shù)據(jù)后抗斤,手動(dòng)對(duì)price數(shù)據(jù)進(jìn)行處理囚企。