Ruby on rails 用于GPS坐标的Rails 3浮点或十进制

Ruby on rails 用于GPS坐标的Rails 3浮点或十进制,ruby-on-rails,floating-point,decimal-point,Ruby On Rails,Floating Point,Decimal Point,我需要在数据库中存储GPS坐标。我听说浮点数不如小数准确。这是真的吗?如果是这样,使用浮点数的原因是什么?如果您希望小数的精度达到100%,请乘以10**n(其中n是您所需的精度),并存储为整数 浮点对象使用本机体系结构的双精度浮点表示来表示不精确的实数 见: 如果你想要更精确的GPS坐标,那么是小数就是最好的选择。您可以通过如下迁移方式创建它们: create_table "models" do |t| t.decimal "latitude", :precision => 15,

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

如果您希望小数的精度达到100%,请乘以10**n(其中n是您所需的精度),并存储为整数

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

见:


如果你想要更精确的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

人们使用浮标的原因是,对于大多数使用情况,浮标通常足够精确,存储空间也较少。

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

因此:

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

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

因此:

  • 0位精度:±74公里
  • 1位精度:±7.4公里
  • 2位精度:±0.74公里
  • 3位精度:±74米
  • 4位精度:±7.4米
  • 5位精度:±0.74米
  • 6位精度:±7.4厘米
  • 7位精度:±0.74厘米

因此,
DECIMAL(10,7)
类型的字段足够精确地满足您的要求。

正如您在Paul的回答中所看到的,它取决于您的用例。
浮点提供大约6位十进制数字的精度。

±11 cm对于(比如)地址来说是完全可以接受的。如果您正在显示地址,则不太可能执行任何算术运算,从而导致舍入错误。

@jac请参阅:
http://www.ruby-forum.com/topic/208222
以及为什么十进制不能解决您的问题。@Ani我不确定我是否明白。我在我的应用程序中使用它而不是浮点数来获得更高精度的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