Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Ayuda con redondeo (https://www.clubdelphi.com/foros/showthread.php?t=93912)

Oscar Guzmán 06-05-2019 02:02:26

Ayuda con redondeo
 
Saludos a todos en el foro


Quisiera saber si alguien me puede ayudar con lo siguiente:


Tengo que redondear los productos de una tabla, respecto a sus precios y costos siendo lo partícular de este asunto que no se tiene que redondear los decimales sino de la siguiente forma.


Producto 1 : 25.430,25 debe quedar en 25.990,00
Producto 2 : 36.751,00 debe quedar en 36.990,00
Producto 3 : 18.950,45 debe quedar en 18.990,00
Producto 4 : 18.992,00 debe quedar en 19.990,00
Y así sucesivamente con todos los productos que han sido llamados para actualizar su precio, es decir, todos deben ser llevados a la cifra 990 más cercana en incremento.



La función de round de delphi no me ayuda en este sentido y quisiera saber si alguien haya tenido un caso parecido y me oriente con esto


Gracias.

oscarac 06-05-2019 05:23:06

puedes idearte una rutina

los importes que tienes llevarlas hasta el millar mas proximo y restarle 10, salvo en el ultimo ejemplo que cuando se pasa de 990, le sumas 1000 y redondeas hasta 990

bucanero 06-05-2019 10:16:04

hola a todos

prueba este código

Código Delphi [-]
function EspecialRound(const value: Currency): Currency;
begin
  Result := value / 1000;
  Result := TRUNC(TRUNC(Result) + Frac(Result) / 0.99) + 1;
  Result := 1000 * Result - 10;
end;

procedure TForm2.test;
const
  values: array[1..4] of Currency = (25430.25, 36751, 18950.45, 18992);
var
  i: LongInt;
begin
  for i := 1 to 4 do
    Memo1.Lines.Add(format('%m: %m', [values[i], EspecialRound(values[i])]));
end;

Un saludo

Oscar Guzmán 06-05-2019 14:47:24

Cita:

Empezado por oscarac (Mensaje 531801)
puedes idearte una rutina

los importes que tienes llevarlas hasta el millar mas proximo y restarle 10, salvo en el ultimo ejemplo que cuando se pasa de 990, le sumas 1000 y redondeas hasta 990


Hola Oscarac y gracias por responder


Si, en eso ando, sólo que quería saber si había alguna función en Delphi que permitiera hacer esa clase de redondeos, gracias.

Oscar Guzmán 06-05-2019 14:48:49

Cita:

Empezado por bucanero (Mensaje 531805)
hola a todos

prueba este código

Código Delphi [-]function EspecialRound(const value: Currency): Currency; begin Result := value / 1000; Result := TRUNC(TRUNC(Result) + Frac(Result) / 0.99) + 1; Result := 1000 * Result - 10; end; procedure TForm2.test; const values: array[1..4] of Currency = (25430.25, 36751, 18950.45, 18992); var i: LongInt; begin for i := 1 to 4 do Memo1.Lines.Add(format('%m: %m', [values[i], EspecialRound(values[i])])); end;


Un saludo


Hola Bucanero, gracias.


Voy a probar tu código y confirmo por aquí si me funcionó o si tuve que modificarle algo, gracias por la información

Oscar Guzmán 07-05-2019 18:02:32

Hola Bucanero,


Haciendo solo algunas modificaciones a mi código pude resolver el problema, en realidad fue facil partiendo del uso múltiple de trunc.


Muchas gracias por tu ayuda y por tu tiempo.



Coloco el código para que otros puedan aprovecharlo

Código Delphi [-]
  function EspecialRound(const value, FactorAprox : Currency) : Currency;
  var
    FactorAprox1 : real;
    begin
      FactorAprox1 := FactorAprox / 1000;
      Result := value / 1000;
      Result := Trunc(trunc(Result) + Frac(Result) / FactorAprox1) + 1;
      Result := 1000 * Result - (1000 - FactorAprox);
    end;


La franja horaria es GMT +2. Ahora son las 13:21:46.

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