Rails BigDecimal精度没有帮助浮动

时间:2015-02-13 23:43:16

标签: ruby-on-rails ruby json floating-point

我在Rails 4 / Ruby 2.1中存储gps坐标,并且遇到了一个奇怪的问题。我的迁移有这个:

t.decimal :latitude, precision: 9, scale: 6
t.decimal :longitude, precision: 9, scale: 6

这导致Rails使用BigDecimals来存储它们。然而,它们被某些数字破坏了:

2.1.5 :001 > p BigDecimal.new(-122.41146504878998,9)
#<BigDecimal:6f60da0,'-0.122E3',9(27)>
 => #<BigDecimal:6f60da0,'-0.122E3',9(27)> 
2.1.5 :002 > p BigDecimal.new(-122.41146504878999,9)
#<BigDecimal:6f681b8,'-0.122411465E3',18(27)>
 => #<BigDecimal:6f681b8,'-0.122411465E3',18(27)> 

第一个示例由于某种原因丢失了所有精度,导致-122.000000存储在db中。

我猜这是因为中间表示在irb中都是一个浮点数,也许在json解析器中。

我该如何避免这种情况?我在json体中接收到这个数据,是从json转换到精度丢失了吗?我应该将这些存储/传输为字符串吗?

0 个答案:

没有答案