PDA

Ver la Versión Completa : Problemas con Redondeos


AGAG4
14-11-2005, 19:01:49
Ya he investigado en los foros, hay mucha información sobre este tema, pero no he encontrado la manera de solucionar el problema que tiene RoundTo, SimpleRoundTo, de Redondear decimales con valor 5, la única función de delphi que he probado que se acerca es la FloatToStrF, pero esta tiene que recibir String's en vez de Valores Reales ó Flotantes, y se preguntarán porque no convierto de String a Flotante, yo les respaldo ya lo hice y por esta conversión falla el redondeo de la función FloatToStrF, pongo los ejemplos de esta misma:

edit2.text:=FloatToStrF(StrToFloat('6.225'), ffFixed, 18, 2);
//Valor que despliega es 6.223 que es el correcto
Pero si hago esto....

var
Valor:double;
begin
Valor:=6.225;
edit2.text:=FloatToStrF(FloatToStr(Valor), ffFixed, 18, 2);
//Me da el Resultado 6.22
{Me Obliga a darle un String en vez de darle un valor Real}


Agradezco cualquier sugerencia.

AGAG4
14-11-2005, 20:13:09
Tuve que hacer una Mexicanada como aqui en México se dice,

//Antes
edit2.text:=FloatToStrF(FloatToStr(Valor), ffFixed, 18, 2);
//Ahora
var
ValorReal:Double;
ValorReal:=FloatToStrF(StrToFloat(FloatToStr(ValorReal)), ffFixed, 18, 2);

Como ven tengo que recibir el valor de tipo Real y convertirlo a String y devolverlo a Flotante y apenas asi me redondea a 6.23 el valor 6.225

Espero ha alguien le sirva.

[Gunman]
14-11-2005, 20:26:22
No entiendo muy bien el problema que planteas, pero por ejemplo, si quieres redondear un numero de coma flotante a su valor más próximo con dos cifras decimales entonces:
Añades la libreria Math a tu programa...

uses Math;

...y te creas esta función (por ejemplo)

function RedondeoReal(Valor: Real): Real;
begin
SetRoundMode(rmNearest);
Result := RoundTo(Valor, -2); //RoundTo(ValorARedondear,Cifras decimales (-2) o 0 a añadir (2)
end;

AGAG4
14-11-2005, 21:51:39
Creo que no has probado Bien el RoundTO, enviale un valor entero cualquiera, con terminación en decimal 5 y no te redondea correctamente hacía arriba:
Te doy el ejemplo:

....
var
Valor:Real;
begin
....
Valor:=6.225;
edit2.text:=FloatToStr(RoundTo(valor,-2));
//El valor resultante es de 6.22 en vez de ser 6.23


Espero haberme explicado

jachguate
14-11-2005, 23:38:44
edit2.text:=FloatToStr(RoundTo(valor,-2));
//El valor resultante es de 6.22 en vez de ser 6.23

El resultado de 6.22 es un valor correcto según las reglas de redondeo (http://es.wikipedia.org/wiki/Redondeo)

Creo que no has probado Bien el RoundTO
Creo que el problema no está en la función en si, sino en el valor que vos esperas que devuelva, puesto que es un valor erroneo.

Hasta luego.

;)