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数据进行处理。
网友评论