我在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转换到精度丢失了吗?我应该将这些存储/传输为字符串吗?