Paradojas de la informática

Started by Drumpi, November 16, 2018, 12:57:06 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

panreyes

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

FreeYourMind

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

SplinterGU

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?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

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

darío

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.
My sites:
Smart Fpg Editor - Painless FPG Edition for Bennu and PixTudio
fenixlib - .NET support for manipulating PixTudio, Bennu and Div graphic formats

warrior_rockk

Yo para comparaciones entre reales,floats o doubles, siempre trunco a x decimales cada valor para evitar esto.

Drumpi

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
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)