Podriamos inventar una función que, dado un valor, haga un redondeo al múltiplo mas cercano (por ejemplo del valor mínimo de la moneda de tu pais, que parece ser de 5 centimos).
así:
Código Delphi
[-]
type
TTipoRedondeo = (trMatematico, trAlMenor, trAlMayor);
function jachRedondeaMultiplos(valor, base : extended;
TipoRedondeo : TTipoRedondeo = trMatematico; DigitosPrecision : Integer = 2) : extended;
var
multiplicando : Int64;
fraccion : Extended;
const
precision_fraccion = 6;
begin
multiplicando := round(valor / base);
fraccion := roundTo(frac(valor / base), -precision_fraccion);
case TipoRedondeo of
trAlMayor : if (fraccion > 0) and
(fraccion < 0.5) then
multiplicando := multiplicando + 1;
trAlMenor : if (fraccion >= 0.5) and
(fraccion < 1) then
multiplicando := multiplicando - 1;
end;
result := roundTo(multiplicando * base, -DigitosPrecision);
end;
Los parámetros son:
Valor: el valor que queres redondear,
base: la moneda de menor denominación de tu pais (o a la que te interese redondear)
TipoRedondeo: creo que no necesita explicación..
DigitosPrecision: Cuantos dígitos de precisión se usan en la moneda de tu pais. Si son céntimos, el valor será 2 (el que tiene por defecto).
Una llamada típica entonces podria ser:
Código Delphi
[-]
jachRedondeaMultiplos(Producto.costo * factorganancia, 0.05, trAlMayor);
Te aclarará también la siguiente tabla de resultados de llamadas a la función (asumiendo un redondeo a monedas de 0.05
Código:
|-----------|-----------|-----------|-----------|
| valor | matemático| al menor | al mayor |
|-----------|-----------|-----------|-----------|
| 1.41 | 1.40 | 1.40 | 1.45 |
| 1.45 | 1.45 | 1.45 | 1.45 |
| 7.23 | 7.25 | 7.20 | 7.25 |
| 14.32 | 14.30 | 14.30 | 14.35 |
| 8.69 | 8.70 | 8.65 | 8.70 |
|-----------|-----------|-----------|-----------|
Hasta luego.