Ver Mensaje Individual
  #12  
Antiguo 14-09-2010
rrf rrf is offline
Miembro
 
Registrado: ago 2003
Ubicación: S/C Tenerife, España
Posts: 454
Reputación: 22
rrf Va por buen camino
Wink

Hola a todos/as.

El tema del redondeo me ha preocupado en varias ocasiones.

El problema que tengo es cuando aparece un valor como 0.75444448 y lo quieres redondear a 3 decimales.

Lo normal en todas las funciones que he visto (incluidas las que he revisado en este hilo) es que, para redondear a 3 decimales, se utilizan 4 decimales y, en este ejemplo (el valor 0.75444448), el redondeo daría 0.754 .

Lo que es muy correcto, pero que no aprovecha la totalidad de decimales disponibles.

Si se aprovecharan todos los decimales para redondear, el valor final debería dar 0.755 .

Todo ello redondeando con:
Código Delphi [-]
SetRoundMode( rmUp ) ;

Como el tema no se resuelve en las funciones de otras personas que he visto, me he animado a hacer una función en la que se indique lo que es normal, el valor decimal y el número de decimales a los cuales hay que redondear; pero añadiendo otro parámetro: el número de decimales desde el que se empieza a redondear de forma decreciente.

En el ejemplo, el valor 9.97444756, se redondea a 3 decimales y se empieza a calcular el redondeo desde los 7 decimales (luego se hará con 6, luego con 5, ... hasta que se llegue a 3).

He utilizado recursión y es de la primeras veces que lo hago; así que puede haber algún error, aunque las pruebas que hice salieron bien.

Este es el código:

Código Delphi [-]
uses math ;
.......
.......

function TForm1.Redondea2(DD: double; Max_Dig, Num_Dig: integer): double;
begin
    // Redondea el valor DD
    // a un total de Num_Dig dígitos decimales
    // partiendo en el redondeo desde el dígito decimal Max_Dig
    //----------------------------------------------------------

  if Max_Dig >= Num_Dig
    then result := Redondea2( RoundTo( DD, - Max_Dig ), Max_Dig -1, Num_Dig )
    else result := DD ;

end;

procedure TForm1.btn5Click(Sender: TObject);
begin

  SetRoundMode( rmUp ) ;
  Label1.Caption := FloatToStr( Redondea2( 9.97444756, 7, 3) ) ;

end;

Lo incluyo por si esto le es útil a alguien.

Saludos.
Responder Con Cita