Problema con decimales en mysql

1,953 views
Skip to first unread message

@cbertelegni

unread,
Sep 12, 2013, 4:06:53 PM9/12/13
to rub...@googlegroups.com
Buenas, me encuentro en un problema que ya me esta poniendo de muy mal humor...
Mi aplicación, en ROR, lee un xls con la gema ROO, en las filas hay un campo que es de dinero y el problema es que en la db ignora los decimales menores a *.50 los ignora y me lo guarda sin ellos. ya intente en la migración ponerlo con :integer, :float y :decimal al campo. alguien tiene alguna sugerencia o paso por lo mismo?
ej: 1254.95 (lo guarda bien)
     1254.24 (ignora el 0.24)

Desde ya mil gracias.

Ing. Mariano Cruceño

unread,
Sep 12, 2013, 4:27:14 PM9/12/13
to rub...@googlegroups.com
Hola, eso te lo hace el campo en la db? es decir si le cargas el dato a mano directo en la db te guarda como indicas?

Saludos

@cbertelegni

unread,
Sep 12, 2013, 4:42:37 PM9/12/13
to rub...@googlegroups.com
Gracias mariano.
mirá, es medio raro, ahora lo tengo al campo como float. tengo un registro de `valor_fiscal` = 21571.25
tiro esta consulta:
irb(main):008:0> b= Bien.where(:valor_fiscal => 21571.25).first
irb(main):009:0> b.valor_fiscal
=> 21571.2

encuentra el registro pero me come el 5, este es uno de los temas.

Luis Lavena

unread,
Sep 12, 2013, 4:55:41 PM9/12/13
to rub...@googlegroups.com
Saludos,



2013/9/12 @cbertelegni <cristianb...@gmail.com>
Podrias compartir el schema de la tabla donde estas guardando? cuando se trata de decimales, es muy importante el precision con el que se estan almacenando.

Es una buena practica tambien que cuando se trata de dinero, los valores se guarden en centavos para evitar los problemas de punto flotante que tienen las diferentes implementaciones de los lenguajes.
 
Desde ya mil gracias.

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Luis Lavena
AREA 17
-
Perfection in design is achieved not when there is nothing more to add,
but rather when there is nothing more to take away.
Antoine de Saint-Exupéry

Matias Mascazzini

unread,
Sep 12, 2013, 5:38:11 PM9/12/13
to rub...@googlegroups.com
¿En todos los entornos de Rails te pasa lo mismo? ¿Cómo esta la implementación física de la base de datos?
¿Y ese valor_fiscal como que esta definido?

O hay un problema cuando lees el valor y lo guardas en la variable. O hay un problema cuando guardas el dato en la DB. En algún extremo esta haciendo una conversión.

Saludos
Matías


2013/9/12 Luis Lavena <luisl...@gmail.com>

Ing. Mariano Cruceño

unread,
Sep 12, 2013, 6:01:25 PM9/12/13
to rub...@googlegroups.com
Seguramente, Por eso mi pregunta fue si cargaba manualmente para saber si es tema de la bd o de la app. Coincido y me inclino en que pude ser un tema de la configuración de lenguaje tocando de oído, sin ver la app es complicado saber. 

Ariel Burone

unread,
Sep 12, 2013, 6:59:54 PM9/12/13
to rub...@googlegroups.com
El campo en la base tiene que ser de tipo decimal.
Si tiras un SHOW CREATE TABLE tabla; El campo tendrías que verlo como decimal(10,2) (O la precisión que le hayas especificado), ojo que los decimales restan posiciones a los enteros. En este caso que puse te quedan 8 dígitos para enteros y 2 para decimales.

No hagas conversiones a float por que ahi es a donde vas a acarrear error.
En Ruby puro la mejor forma de manejar valores con coma es con Bigdecimal. Pero no creo que Rails te deje controlar a ese nivel.
Fijate con la gema Money que funciona bien (e internamente usa Bigdecimal)

Sino podes usar la opcion que te dio Luis de almacenar los centavos como enteros y convertir en la vista. Pero en cuanto apliques una división (para calcular impuestos por ejemplo) vas a tener una conversión a float...

Saludos


2013/9/12 Ing. Mariano Cruceño <mariano...@gmail.com>

Prefiero.PHP

unread,
Sep 12, 2013, 8:06:21 PM9/12/13
to rub...@googlegroups.com
http://archive.railsforum.com/viewtopic.php?id=54632

En MySQL los float son mantisa * exponente, por lo que no puede representar todos los números de un rango, tiene baches no constantes entre cada número.
10000.21 lo guarda como si fuera algo así 10000.209999999999999999999999...923 (número inventado, no es un ejemplo real).
Si necesitas conservar el número exacto usá decimal.

Saludos


@cbertelegni

unread,
Sep 13, 2013, 1:51:22 PM9/13/13
to rub...@googlegroups.com
mil gracias a todos!
Acá estaba la solución a mi problema:

Nacho Facello

unread,
Sep 13, 2013, 1:54:20 PM9/13/13
to rub...@googlegroups.com
2013/9/13 @cbertelegni <cristianb...@gmail.com>

mil gracias a todos!
Acá estaba la solución a mi problema:

Esa es exactamente la misma solución que te plantearon en este thread: no usar floats, usar decimals (o enteros, y contar en centavos).


--
Nacho Facello
:wq

@cbertelegni

unread,
Sep 13, 2013, 1:59:31 PM9/13/13
to rub...@googlegroups.com, na...@nucleartesuji.com
si! por eso dije "GRACIAS"
gracias Prefiero.PHP por el link y a los demas por los comentarios de ayuda.

Matias Mascazzini

unread,
Sep 13, 2013, 2:08:11 PM9/13/13
to rub...@googlegroups.com
Bueno contanos la solución con tus palabras pue!

Saludos
Matías


2013/9/13 @cbertelegni <cristianb...@gmail.com>

--

@cbertelegni

unread,
Sep 13, 2013, 2:17:53 PM9/13/13
to rub...@googlegroups.com
UFA! je.

El tema es que yo no estaba definiendo la precisión en los decimales, y me generaba este tema. La solución fue hacer la especificación en la migración de la db:
t.decimal :valor_fiscal, precision: 10, scale: 2

Gracias a todos por la onda y la mano.

Luis Lavena

unread,
Sep 13, 2013, 3:04:42 PM9/13/13
to rub...@googlegroups.com
2013/9/13 @cbertelegni <cristianb...@gmail.com>
UFA! je.

El tema es que yo no estaba definiendo la precisión en los decimales, y me generaba este tema. La solución fue hacer la especificación en la migración de la db:
t.decimal :valor_fiscal, precision: 10, scale: 2

Gracias a todos por la onda y la mano.


Dicho de paso, si estas con MySQL, cuidado con tocar un campo decimal que ya tenia valores:


Reply all
Reply to author
Forward
0 new messages