2011-02-11 14 views
15

Tengo valores de latitud y longitud en mi base de datos a 10 cifras decimales:¿Cómo forzar un número a 10 decimales en Ruby on Rails?

+----+---------------+-----------------+ 
| id | lat   | lng    | 
+----+---------------+-----------------+ 
| 55 | 34.4208305000 | -119.6981901000 | 
| 56 | 30.2671530000 | -97.7430608000 | 

necesito para consultar la base de datos para un partido, pero mi variable actual es un flotador con sólo 6 decimales:

self.lat => 30.267153 

¿Cómo puedo convertir mi flotador para tener los decimales adicionales para que pueda obtener una coincidencia?

myloc = Marker.where("lat = ?", self.lat) 

He visto los documentos Decimal y BigDecimal. ¿Son esos el mejor enfoque?

Ruby 1.8.7, Rails 3. Gracias por cualquier consejo.

Respuesta

25

Usted puede utilizar sprintf — o es hermano más simple String#% — para dar formato al número de punto flotante como una cadena con 10 decimales:

f = 30.267153 
s = "%0.10f" % f 
#=> "30.2671530000" 

Esto parece a pescado para mí, sin embargo; ¿Qué tipos de campos son tus columnas lat y lng? ¿Qué RDBMS estás usando? ¿De verdad quieres comparar valores de punto flotante exactamente? ¿Realmente quieres guardarlos como cadenas?

+0

Genial, eso funcionó, gracias. Es mysql. Los campos lat/lng se definen como tipo decimal (15,10). Este es un caso especial para verificar una ubicación duplicada antes de almacenar un marcador nuevo, por lo que no termina con marcadores uno encima del otro, por lo tanto, la comparación exacta. – heyrolled

+4

Estoy bastante seguro de que el punto de Phrogz fue que, por lo general, no es prudente comparar los valores de coma flotante para la igualdad. –

+0

Gracias por señalar eso, lo entiendo ahora. Voy a reflexionar sobre eso y hacer algunas pruebas. – heyrolled

7

puede probar esto:

"%.10f" % self.lat