FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
||||
|
||||
No entiendo el uso de decimales
Hola amigos.
He tenido un problema (no se si ocurrira solo con D7 que es con el que trabajo) ya que cuando trabajo con numeros flotantes tiende a agregarme decimales. No le habia dado importancia hasta q mi cliente protestó porque cuando el hace una factura, la guarda y la recupera las cantidades no coinciden entre la factura que ha impreso y la que esta guardada. Ejemplifico: Ahorita estoy debuggeando un programa en el cual yo escribo por ejemplo 8.52 en un DecimalSpin. Al acceder a su propiedad "value" para obtener el numero me agrega digitos
Como pueden notar el error es de solo 0.01 pero en una factura con 10 o 20 productos hacen variaciones de 10 a 20 centavos. Pensé que el problema podría ser el Control, sin embargo me repite el mismo problema con cualquier otro control para decimales. De hecho hice otro experimento
No entiendo el motivo de este comportamiento con los decimales. Asi que les pido tengan la gentileza de darme un poco de ayuda para corregir este problema. Muchas gracias de antemano. |
#2
|
|||
|
|||
Es porqué trabajas con variables de coma flotante (float o reals). Para evitar estos problemas de redondeo, se debe usar siempre variables de tipo Currency (que es coma fija).
|
#3
|
||||
|
||||
No solamente variables, obviamente, los campos de la base de datos también.
|
#4
|
||||
|
||||
woW
A eso iba exactamente mi siguiente duda, ya que en MySQL me ocurria lo mismo. Ya estuve leyendo un poco y veo que para MySQL se debe especificar la columna como DECIMAL(M,D) pero me confunde un poco los parametros.
Para moneda cual seria la precision recomendada?? Por ahora estoy utilizando DECIMAL(4,2) Gracias nuevamente, aprecio mucho su ayuda |
#5
|
||||
|
||||
Un poco de off-topic y de SPAM: Hace un tiempo escribí un artículo titulado El Valor de un Céntimo, que está relacionado con el tema del manejo de valores fraccionarios en computadoras digitales. Seguro que te clarifica las cosas.
|
#6
|
||||
|
||||
Hola,
Lecturas obligadas: 1. What Every Computer Scientist Should Know About Floating-Point Arithmetic 2. Comparing floating point numbers 3. Floating point numbers Creo que con ello uno ya se hace la idea. Saludos, PD: A quien no le guste el inglés como a mi, ármese de valor. |
#7
|
||||
|
||||
Cita:
|
#8
|
||||
|
||||
Es mas de lo que pensé
Ok, Ahora tengo mucha tarea :S
Gracias por los valiosos consejos. Y le entraré con valor al inglés aunque no me gusta. |
#9
|
||||
|
||||
Inteligente truco
Cita:
Cita:
Muchas gracias, excelente aporte |
#10
|
||||
|
||||
Cita:
Verás, primero tenemos una tabla denominada divisa, más o menos así: Ahora imaginemos que nuestra moneda principal serán los euros. En principio podríamos ponerle el valor "1", pero tiene céntimos así que sería más lógico que fuera "100". Sin embargo hay divisas cuyo valor es inferior al céntimo de euro (como la antigua peseta, por ejemplo) así que le damos el valor "10.000". Pues damos de alta a la divisa: Ahora metemos dólares. Primero, tenemos que saber cuántos euros es un dólar, que según Google, cuando escribo esto es 1U$ = 0'707063565€. Multiplicamos por el valor del euro, esto es, por 10.000, y nos sale 7.071: Ahora vamos a por los productos: Como ves, el precio es un entero. Para introducir el precio, pues sólo tenemos que multiplicarlo por el valor de la divisa en la que hayamos introducido el precio: Y ya está. Ahora todos los cálculos los hacemos con enteros, pero cuando mostremos el precio tenemos que dividir por el valor de la divisa y nos dará el precio. Por ejemplo, nuestra chocolatina: Código:
En euros: 12.000 / 10.000 = 1'20€ En dólares: 12.000 / 7.071 = 1'68U$ Espero que haya quedado más claro. Última edición por Ñuño Martínez fecha: 17-05-2011 a las 10:12:08. |
#11
|
||||
|
||||
Podria marcar una tendencia
Hola de nuevo Ñuño.
Gracias por tomarte el tiempo y la molestia para esta excelente explicación. Ahora estoy evaluando de que manera puedo implementarlo al proyecto, aunque ahora es un poco complicado ya que habria que cambiar la estructura de la BD. Pero creo que el cambio bien valdría la pena. Espero que pronto algunos mas de nuestros expertos comenten y enriquescan tu aporte, yo creo que incluso podría incluirse a la sección de Trucos. |
#12
|
||||
|
||||
Hola,
Lo que comenta Ñuño es más o menos similar a lo que comenté en una ocasión en un hilo en DA. La idea es que todo se opere a nivel de enteros y sólo a efectos de presentación se da su equivalente en formato real, con decimales. Recomendaría la lectura de todo el hilo, ofrece un interesante planteo de lo que es el mundillo de los números flotantes. Saludos, |
#13
|
||||
|
||||
Estas cosas son las que se aprenden con la experiencia, después de haber sufrido algún problema con clientes que no le cuadran las cuentas y tienes que volverte loco buscando una buena solución .
|
#14
|
||||
|
||||
Cita:
Por cierto, que algunas bases de datos (como dBase) y lenguajes de programación (como COBOL) no usan punto flotante, sino algún tipo punto fijo (sea este en base decimal o binaria, o codificándolo diréctamente a ASCII), lo cual es más o menos lo que hemos explicado aquí y en el hilo que has enlazado. Incluso algunos microporcesadores, como el mítico Z-80, permitían operar directamente con BCD u otras notaciones de punto fijo. Creo que PowerPC permite usar tanto punto flotante como el fijo. Última edición por Ñuño Martínez fecha: 18-05-2011 a las 10:59:41. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
ayuda con mi tarea no entiendo!! | chairez0490 | Varios | 3 | 16-12-2009 04:20:58 |
Cable de red que no lo entiendo | Petolansa | Redes | 2 | 21-04-2009 14:55:33 |
no entiendo Intraweb | davidvamo | Internet | 15 | 24-04-2008 05:34:16 |
No lo entiendo | ramonibk | MS SQL Server | 11 | 20-05-2004 20:23:20 |
No entiendo | rastafarey | Firebird e Interbase | 1 | 03-12-2003 17:14:30 |
|