2012-06-14 11 views
12

Ho bisogno di memorizzare le coordinate GPS in un database. Ho sentito dire che i float sono meno precisi dei decimali. È vero? In tal caso, quale motivo ci sarà per utilizzare i galleggianti?Rails 3 Float o decimal per le coordinate GPS

risposta

12

Se vuoi le coordinate GPS più accurati, allora sì decimali sono la strada da percorrere. È possibile creare loro con una migrazione simile:

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 

Il motivo la gente usa carri è che di solito sono abbastanza precisi per la maggior parte dei casi d'uso e di utilizzare meno spazio per memorizzare.

+0

@jac Vedere: 'http: // www.ruby-forum.com/topic/208222' e perché il decimale non risolve il problema. – Anil

+0

@Anil non sono sicuro che io segua. Lo uso nella mia applicazione invece di float per coordinate GPS di precisione più elevata e funziona esattamente come mi aspetto. –

1

Se si desidera una precisione del 100% con i decimali, moltiplicare per 10 ** n (dove n è la precisione desiderata) e memorizzare come numero intero.

Gli oggetti mobili rappresentano numeri reali inesatti utilizzando la rappresentazione in virgola mobile a precisione doppia dell'architettura nativa.

See:

http://www.ruby-doc.org/core-1.9.3/Float.html 
24

Da Terra circonferenza equatoriale è circa 40000 km e longitudine estende 360 gradi, ne consegue che in prossimità dell'equatore 1 gradi equivale a 110 chilometri.

Così:

  • 0 precisione cifre: ± 110 km
  • precisione 1 cifra: ± 11 km
  • 2 precisione cifre: ± 1,1 km
  • 3 precisione cifre: ± 110 m
  • Precisione a 4 digit: ± 11 m
  • Precisione a 5 digit: ± 1,1 m
  • Precisione a 6 cifre: ± 11 centimetri
  • 7 precisione cifre: ± 1,1 centimetri

Tuttavia, più ci si sposta ai polacchi, più piccole sono le lunghezze dei parallelismi diventa. Ad esempio vicino a Parigi, che ha una latitudine di 48 gradi, 1 grado equivale a cos(48) * 110 = 74 km.

Così:

  • 0 precisione cifre: ± 74 km
  • precisione 1 cifra: ± 7,4 km
  • 2 precisione cifre: ± 0,74 km precisione
  • 3 cifre: ± 74 m
  • Precisione a 4 digit: ± 7.4 m
  • Precisione a 5 digit: ± 0.74 m
  • 6 cifre precisio n: ± 7,4 cm
  • Precisione a 7 cifre: ± 0.74 cm

Quindi, il campo di tipo DECIMAL(10,7) sarebbe sufficiente per soddisfare l'utente piuttosto preciso.

+1

https://en.wikipedia.org/wiki/Decimal_degrees –

1

Come puoi vedere nella risposta di Paolo, dipende dal tuo caso d'uso.
Un valore float fornisce una precisione di circa 6 cifre decimali.
± 11 cm è abbastanza accettabile per, ad esempio, un indirizzo. e se stai visualizzando gli indirizzi è improbabile che tu faccia qualche operazione aritmetica che comporti errori di arrotondamento.

Problemi correlati