Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al Multiplicar (Función de Redondeo) (https://www.clubdelphi.com/foros/showthread.php?t=90129)

Neeruu 12-04-2016 15:35:51

Error al Multiplicar (Función de Redondeo)
 
Hola a todos, tengo la siguiente función para redondear:

Código Delphi [-]
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:
Código Delphi [-]
  Nro := Numero * Potencia(10, PrecisionDec);

Alguien sabe porque se puede dar esto?

Saludos...

Casimiro Noteví 12-04-2016 20:16:58

Si quieres redondear, por ejemplo, a 2 decimales:
Código Delphi [-]
resultado := redondeo(importe,2);
Código Delphi [-]
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

Cita:

Empezado por Neeruu (Mensaje 504319)
...
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.
Código Delphi [-]
...
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


La franja horaria es GMT +2. Ahora son las 01:56:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi