Bennu Game Development

Foros en Español => Offtopic => Topic started by: Drumpi on November 16, 2018, 12:57:06 AM

Title: Paradojas de la informática
Post by: Drumpi on November 16, 2018, 12:57:06 AM
Sé que estos temas os importan una M, pero ya que estoy aquí os voy a contar una anécdota que me ha pasado en el trabajo:
Estaba yo tan tranquilo haciendo mi programa en C#, cuando al intentar realizar un pago de una factura... ¡DESPERTAD!Decía que intentaba realizar el pago de una factura, cuando el programa me lanzó un error: "No se puede realizar el pago completo de la factura: 1'2€ del pago no son los 1'2€ de la factura". What?Me fui al código, al método de comprobación de valores, y puse una interrupción en una línea que rezaba algo como:
IF (totalACobrar != Factura.LineTotal) error = 2;
Cuando el programa se paró en esa línea, comprobé con gran estupor que totalACobrar daba un valor de 1'2, y que Factura.LineTotal valía 1'2. ¿Me estaba diciendo el programa que 1'2 era diferente a 1'2?Después de reflexionar acerca de las implicaciones de este acertijo zen, me puse el cerebro de programador atiborrado de una cucharadita de cafeina, buscando cosas raras acerca de las variables, las llamadas a métodos...Un compañero se me acercó por detrás, y cuando le comenté que ya estaba haciendo las maletas para el Himalaya, me pidió que probase a restar ambos valores.
Estaba claro lo que pasaba.
Y por eso, queridos amigos, odio los tipo double, al igual que los float y cualquier tipo de datos que impliquen coma flotante, porque aunque digan que son muy precisos, a mi no me la dan con queso, y si esto es un problema que trae de cabeza a los mejores matemáticos e ingenieros del mundo, no veo por qué hay que lidiar con estas... barrabasadas en el día a día de un programador de oficina, al que sólo le hacen falta dos (tres en mi caso) decimales para trabajar :D :D :D
Son las dos de la mañana y aun me sigo preguntando, si 1'2 es distinto a 1'2, ¿a qué es igual? :D :D :DNo le vuelvo a dar té de beber al duende del ordenador de la oficina.
Title: Re:Paradojas de la informática
Post by: panreyes on November 16, 2018, 01:02:36 AM
Dos cosas:
1. Tipo moneda. Sino lo hay, créalo xD Y si no puedes, conviértelo en el momento.
2. No sé qué lenguaje usas, pero tíralo a la basura xD
Title: Re:Paradojas de la informática
Post by: FreeYourMind on November 16, 2018, 05:31:06 AM
C# es amor.
Seguramente es porque son objetos distintos, debes comparar valores del mismo tipo, en contados casos puedes tener problemas al hacer comparaciones de esa forma
Title: Re:Paradojas de la informática
Post by: SplinterGU on November 16, 2018, 02:46:13 PM
Quote from: FreeYourMind on November 16, 2018, 05:31:06 AM
C# es amor.
Seguramente es porque son objetos distintos, debes comparar valores del mismo tipo, en contados casos puedes tener problemas al hacer comparaciones de esa forma


exactamente eso iba a responder... o preguntar... no sera que un dato es float y el otro double?
Title: Re:Paradojas de la informática
Post by: FreeYourMind on November 16, 2018, 04:00:13 PM
Si. En un poco mañoso en eso. Para strings o objectos del mismo tipo se pude usar == pero si se comparan distintos objetos lo mejor es usar equals() la cual compara objetos por valor...
Su error esta en comparar objetos distintos
Title: Re:Paradojas de la informática
Post by: darío on November 17, 2018, 09:33:04 AM
Esto no es exlusivo de C#... Comparar datos en coma flotante no es en general una buena idea (y da igual que uses == o equals) puesto que todos los tipos de dato de.coma flotante pueden predentar problemas de precisión, pero esto es más evidente cuanto menor es el tamaño del.tipo de datos.


Para valores monetarios hay otros tipos de dato más apropiado llamado decimal.
Title: Re:Paradojas de la informática
Post by: warrior_rockk on November 19, 2018, 12:28:02 PM
Yo para comparaciones entre reales,floats o doubles, siempre trunco a x decimales cada valor para evitar esto.
Title: Re:Paradojas de la informática
Post by: Drumpi on November 26, 2018, 12:06:03 AM
Cmo bien dicen arriba, es C#, y ambos tipos son double, supuestamente un tipo de valor de coma flotante muchísimo más preciso que los típicos float, que se usaron en el viaje a la Luna :D
No importa cuántos decimales se tengan: los números binarios no trabajan con decimales, es un invento de los programadores para tratar con ellos, y por tanto, son imprecisos, y por eso, todos los ordenadores trabajan con un valor "lambda" que indica cómo de imprecisos son, un valor de suma importancia al hacer cálculos numéricos y... que no es el caso aquí :D

Truncar el valor tampoco es una solución. Tengo otro programa que es una pesadilla su depuración, hecho en VB6 (uga buga), en el que redondean los valores a dos decimales para mostrarlos en los grids, y no tengo forma de recuperar, al menos, los 4 decimales que necesito para que al mandarlos a la BBDD no me lancen errores por faltar un céntimo aquí o allí en los cálculos :S

Podría usar decimal, o doubledouble (o como sea el equivalente de los float en 64 bits), pero ya es tarde para modificar el programa, es gigantesco, del orden del más grande que he hecho en Bennu, y usando librerías externas, así que imaginad el mastodonte. Se podría hacer, ya que las variables están bastante localizables, pero necesitaría detener el tiempo unas 12 horas... y si pudiera hacerlo no las emplearía en modificar código del trabajo :P

En serio: si 1'2 es distinto a 1'2 ¿a qué es igual? :D