PDA

Ver la Versión Completa : Error al Multiplicar (Función de Redondeo)


Neeruu
12-04-2016, 15:35:51
Hola a todos, tengo la siguiente función para redondear:


Function Redondear (Numero : Double; PrecisionDec : byte) : double;
function Potencia(Base : Double; Exponente : byte) : Double;
begin
Result := Exp(Exponente * ln(Base));
end;
var Nro:Single;
iRound:Integer;
begin
Nro := Numero * Potencia(10, PrecisionDec);

if (Frac(Nro))>=0.5 then
iRound := 1
else
if (Frac(Nro))<=-0.5 then
iRound := -1
else iRound := 0;

Result := (Trunc(Nro)+iRound) / Potencia(10, PrecisionDec);
end;


Pero cuando redondeo este valor :247999.57 a 2 decimales el valor de la variable Nro es de 24799958, cuando debería ser 24799957...

O sea el error esta en esta linea:

Nro := Numero * Potencia(10, PrecisionDec);


Alguien sabe porque se puede dar esto?

Saludos...

Casimiro Notevi
12-04-2016, 20:16:58
Si quieres redondear, por ejemplo, a 2 decimales:
resultado := redondeo(importe,2);
uses Math;
...
...
function Redondeo (valor: Double; decimales: integer = 0): Double;
var
factor: Double;
begin
factor := IntPower(10,decimales);
//
if valor > 0 then
Result := (trunc((valor*factor)+0.5)) / factor
else
Result := (trunc((valor*factor)-0.5)) / factor;
end;

ecfisa
12-04-2016, 20:56:26
...
Pero cuando redondeo este valor :247999.57 a 2 decimales el valor de la variable Nro es de 24799958, cuando debería ser 24799957...
...
Alguien sabe porque se puede dar esto?

Hola.

...
var
Nro: Double;
...

Saludos :)

Neftali [Germán.Estévez]
13-04-2016, 10:25:04
¿Puedes hacer la misma prueba utilizando tipos Currency?

Delphius
14-04-2016, 00:28:20
Clase número 1 en cualquier lenguaje: aprender los tipos de datos.

¿Desde cuando un Single tiene precisión para 8 decimales? :D