Jump to content


Photo

Problemas con redondeo de numeros reales


  • Please log in to reply
9 replies to this topic

#1 luis.perez

luis.perez

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 20 October 2011 - 12:47 PM

Hola, tengo una aplicación en delphi y tengo muchos problemas con el arrastre de decimales una de las cosas que me pasa y no entiendo porque es:
a,b,c son definidos como real

b:=504.75;
c:=0.02;
a:=strtofloat(formatfloat('#.00',(b*d));

Pues en un procedimiento de una unit a:= 10.09 y en otro procedimiento idéntico definido en el Tdm1 me devuelve a:=10.1 ( con un solo decimal).

Sabes de que puede ser? le he dados vueltas y vueltas, incluso he copiado el código de un procedimiento a otro y nada.

Uso delphi 3.0 en esta aplicación.  (li)
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 20 October 2011 - 03:19 PM

Hola amigo luis.perez !!!

Bienvenido a la comunidad, esperamos que te sientas como en casa  (y)

Lo que veo es que un resultado te lo muestra a un decimal y el otro a dos, lo que nos podría indicar el porqué se ven diferentes... el de un decimal lo redondea y el otro lo muestra con un poco más de exactitud...

Porqué no vamos depurando el código para saber lo que realmente está pasando...

Primero pasa a tu variable a el valor de la multiplicación para saber el valor exacto que está enviando para ambas unidades... después de eso podemos darle el formato que necesitas, ahorita lo importante es ver primero el resultado real de la operación...

Prueba y coméntanos...

Saludox ! :)

  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 20 October 2011 - 03:45 PM

Y si combinas la función round con el format? algo como




delphi
  1. b:=504.75;
  2. c:=0.02;
  3. a:=strtofloat(formatfloat('#.00',round(b*d));


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 20 October 2011 - 03:55 PM



delphi
  1. uses Math;
  2.  
  3.   b:=504.75;
  4.   c:=0.02;
  5.   SetRoundMode(rmNearest);
  6.   a:=RoundTo(b*c, -2);



Saludos.

  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 20 October 2011 - 03:57 PM

Esa  operacion da 10.095, esta a medio camino exacto entre 10.10 y 10.09

Si le mandas redondear primero a dos decimales, la hara a 10.10 por como redondea delphi, la regla del par (entre elegir uno que acaba en par y otro en impar, siempre gana el par, 10.10), esta es la forma correcta matematicamente para este redondeo por varias razones, que no vienen al caso.

Asi que si tu codigo es minimamente diferente, o si las variables no son del tipo exacto en los dos casos, la mas peueña diferencia podria deshacer el empate.

Como lo correcto es 10.10, que segun que format uses te eliminara o no el cero final, yo probaria Format('%3.2f',[d*e]), el que calcula mal es el de 10.09, ese deberias repasarlo, seguramente el formateo haya consistide en "cortar" el resultado 10.095 quitandole el ultimo 5 -truncar- en lugar de redondear y luego formatear, pero sin ver exactamente los dos trzos de codigo es dificil de saber.

Podria ser que en un sitio uses float y en otro double, o que la funcion de formateo no fuese identica, cualquier detalle podria ser.
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4107 posts
  • LocationMadrid - España

Posted 20 October 2011 - 04:02 PM

Añadiendo lo que dice Sergio, float no es recomendable por su imprecisión.

Saludos.

  • 0

#7 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 21 October 2011 - 12:03 AM

Buenas,

Sólo un detalle que no tiene mucha importancia, Float en Delphi no existe, sería Real :p

Para decimales yo uso el Currency, que te da la precisión que no te da el Real

Nos leemos

  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 21 October 2011 - 02:58 PM

Buenas,

Sólo un detalle que no tiene mucha importancia, Float en Delphi no existe, sería Real :p

Para decimales yo uso el Currency, que te da la precisión que no te da el Real

Nos leemos

Si te da la precisión exacta se debe a que el Currency no es un tipo de datos punto flotante. Más bien es de punto fijo... Y para puntualizar más aún: UN ENTERO. Asi es... es un tipo de dato entero, Currency es un alias. Como toda operación en los números enteros, se hace en aritmética exacta.


Por ello es que se recomienda emplear, y para eso es que fue diseñado, Currency para operaciones monetarias. Para forzar a utilizar este tipo cuando se opera con campos (persistentes o no) lo mejor es establecer su propiedad Currency en true.


OJO: Currency es útil hasta 4 decimales. Si quieres más... ¡te suenas!


Saludos,
  • 0

#9 luis.perez

luis.perez

    Newbie

  • Miembros
  • Pip
  • 9 posts

Posted 05 November 2011 - 11:37 AM

He hecho lo que dice Fenareth y he redefinido cálculos intermedios, a ver si así consigo evitar el error, ya os comentaré.

  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 November 2011 - 02:40 PM

Hola,


luis.perez, te voy a pedir que dejes de reportar los post. Ya reportaste 3 veces. Para responder debes ir al final del hilo y hacer clic en "Responder".
Cuando tu reportas los posts de los otros son borrados del hilo y con lo cual ya no es fácil hacer un buen seguimiento. Uno puede haber aportado algo importante, y tu zap. ¡a tomar!


Quisiera pensar que fue un error de tu parte; de todas formas; ¡ten cuidado! y debo hacerte llamar la atención.


Saludos,


  • 0




IP.Board spam blocked by CleanTalk.