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
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.
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
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.
https://en.wikipedia.org/wiki/Decimal_degrees –
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.
@jac Vedere: 'http: // www.ruby-forum.com/topic/208222' e perché il decimale non risolve il problema. – Anil
@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. –