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:
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
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.