13

我需要将 GPS 坐标存储在数据库中。我听说浮点数不如小数准确。真的吗?如果是这样,有什么理由要使用花车?

4

4 回答 4

30

由于地球赤道周长约为40000公里,经度跨度为360度,因此赤道附近1度相当于约110公里

因此:

  • 0位精度:±110公里
  • 1位精度:±11公里
  • 2位精度:±1.1公里
  • 3位精度:±110 m
  • 4位精度:±11 m
  • 5位精度:±1.1 m
  • 6位精度:±11 cm
  • 7位精度:±1.1 cm

但是,您越靠近两极,平行线的长度就越小。例如在巴黎附近,其纬度为 48 度,1 度相当于cos(48) * 110 = 74 km

因此:

  • 0位精度:±74公里
  • 1 位精度:±7.4 km
  • 2位精度:±0.74公里
  • 3位精度:±74 m
  • 4位精度:±7.4 m
  • 5位精度:±0.74 m
  • 6位精度:±7.4 cm
  • 7位精度:±0.74 cm

因此,类型字段DECIMAL(10,7)足以满足您相当精确的需求。

于 2012-09-01T09:26:46.000 回答
15

如果您想要更准确的 GPS 坐标,那么可以选择小数点。您可以使用以下迁移来创建它们:

create_table "models" do |t|
  t.decimal  "latitude", :precision => 15, :scale => 10, :default => 0.0
  t.decimal  "longitude", :precision => 15, :scale => 10, :default => 0.0
end

人们使用浮点数的原因是它们通常对于大多数用例来说足够精确并且使用更少的空间来存储。

于 2012-06-15T02:01:40.787 回答
2

如果您想要 100% 的小数精度,则乘以 10**n(其中 n 是您想要的精度),并存储为整数。

浮点对象使用本机架构的双精度浮点表示来表示不精确的实数。

看:

http://www.ruby-doc.org/core-1.9.3/Float.html
于 2012-06-15T01:49:21.040 回答
1

正如您在 Paul 的回答中看到的,这取决于您的用例。
浮点数提供大约 6 位十进制数字的精度。
±11 厘米对于一个地址来说是完全可以接受的。如果您要显示地址,则不太可能进行任何会导致舍入错误的算术运算。

于 2013-08-12T08:32:29.877 回答