PDA

Ver la Versión Completa : Trabajar con decimales y formatos


ElDuc
28-04-2005, 13:03:53
Intento redondear decimales con "RoundTo" y no me funciona bien, porque redondea a partir del 6:
RoundTo(12.346,-2)=12.35. Correcto.
RoundTo(12.345,-2)=12.34 y debería ser 12.35.

Lo mismo me pasa con FloatToStrF(12.345,ffNumber,15,2)=12.34.

¿Podéis ayudarme?

TheRafa
28-04-2005, 15:34:32
Yo utilizo esta función ya que el redondeo del delphi funciona más o menos como tu dices, incluso un poco más raro ya que el cinco unas veces lo redondea hacia arriba y otras hacia abajo.


function Redondeo(Nro: Double; Dec: Integer): Double;
var
Cad, Cad1, Cad2: String;
Signo, Aux: Double;
begin
try
If Not CadenaVacia(FormatFloat('################.#########',Abs(Nro)))
Then
Begin
If abs(Nro) = Nro Then Signo := 1 Else Signo := (-1);
Aux := Abs(Nro*Power(10,Dec+1));
If scl(',',FloatToStr(Aux)) <> 0
Then Aux := StrToFloat(copy(FloatToStr(Aux),1,scl(',',FloatToStr(Aux))-1));
If Dch(FloatToStr(Aux),1) >= '5' Then Aux := Aux + 10;
Aux := StrToFloat(copy(FloatToStr(Aux),1, length(FloatToStr(Aux))-1));
Redondeo := (Aux/Power(10,Dec))*signo;
End
Else Redondeo := 0;
except
Redondeo := 0;
End;
End;

Elfoscuro
28-04-2005, 15:41:24
¿Y algo así no funcionaría?


entrada:=entrada*100
if entrada-int(entrada)>=0,5 then
entrada:=int(entrada)+1
else
entrada:=int(entrada);
entrada:=entrada/100;


En entrada tenemos el número original y el 100 es para dos decimales, 1000 para 3, etc. Por otra parte... ¿existe la funciona int? ¿o es trunc? Vamos lo que quería con esa función era coger la parte entera, sin redondear, es decir int(1,1)=1 y int(1,7)=1.

Un saludo