Problemas con redondeo de numeros reales
#1
Posted 20 October 2011 - 12:47 PM
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.
#2
Posted 20 October 2011 - 03:19 PM
Bienvenido a la comunidad, esperamos que te sientas como en casa
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 !
#3
Posted 20 October 2011 - 03:45 PM
b:=504.75; c:=0.02; a:=strtofloat(formatfloat('#.00',round(b*d));
#4
Posted 20 October 2011 - 03:55 PM
uses Math; b:=504.75; c:=0.02; SetRoundMode(rmNearest); a:=RoundTo(b*c, -2);
Saludos.
#5
Posted 20 October 2011 - 03:57 PM
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.
#6
Posted 20 October 2011 - 04:02 PM
Saludos.
#7
Posted 21 October 2011 - 12:03 AM
Sólo un detalle que no tiene mucha importancia, Float en Delphi no existe, sería Real
Para decimales yo uso el Currency, que te da la precisión que no te da el Real
Nos leemos
#8
Posted 21 October 2011 - 02:58 PM
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.Buenas,
Sólo un detalle que no tiene mucha importancia, Float en Delphi no existe, sería Real
Para decimales yo uso el Currency, que te da la precisión que no te da el Real
Nos leemos
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,
#9
Posted 05 November 2011 - 11:37 AM
#10
Posted 05 November 2011 - 02:40 PM
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,