Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   redondear decimas de un float como excel. (https://www.clubdelphi.com/foros/showthread.php?t=69833)

Delphius 14-09-2010 21:18:25

Cita:

Empezado por Casimiro Notevi (Mensaje 376425)
:eek::eek::eek: hasta el nombre de las variables se parecen, esa función la hicimos entre mi compañero y yo, un día en la que estábamos desesperados con los redondeos y dijimos "de hoy no pasa, hacemos una función que redondee de verdad". Y nos salió esa que he puesto.
Seguramente los de delphi se copiaron de nosotros :D

Pues ya ves, como son las cosas... ¡Que te paguen los derechos de autor! :D

Choca los 5 amigo, yo empecé a meterme más en esto de los números, el redondeo, cálculo y demás hace unos meses tras recibir unos Horrores de números :o :p

Saludos,

TheJHorse 06-08-2012 07:49:44

Se que el tema esta ya tocado, pero quisiera reincidir en el ejemplo del amigo rrf, pero a solo 2 digitos, aca todos empiezan a nombrar y decir que no se aplica a la realidad, pero quisiera poner el siguiente ejemplo:

Un supermercado que gira facturas al dia en un promedio de 15000 facturas tan solo en uno de sus locales, donde calculos de total: 1.33333333 segun ustedes deberia ser redondeado a 1.33 donde claramente hay una perdida de 0.00333333 centavos para la empresa diario de 50 centavos, 1500 mensual, 18000 anual, tan solo de una sede; lleven el caso para un banco donde las transacciones son aun mayores.

No creo que se deba decir tan alegremente y confiadamente que algo no se aplica a la realidad, por que la realidad mis queridos amigos es absurdamente coherente.

Casimiro Notevi 06-08-2012 09:28:14

Hola, no es así, además de que ninguna empresa, y la de tu ejemplo menos, no pierden dinero, al contrario, ganarán más ;)

Primero, todo depende de la necesidad, una empresa puede querer/necesitar redondear a 2 decimales y tiene que hacerlo de esa forma. Entonces no queda más remedio que redondear.
Segundo, no puedes pedirle a un cliente, en tu caso de ejemplo, que pague 0,00333333 porque no se puede, prueba a pagar tú mismo esa cantidad, lo mínimo que puedes pagar en cualquier sitio, negocio, tienda, banco, etc. es un céntimo: 0,01
Tercero, entonces en tu caso, ¿cuánto le cobras al cliente?, pues eso, 1 céntimo, y ¿qué ocurre?, pues ahora resulta que la empresa no ha perdido 0.00333333 sino que ha ganado: 0,00666666 que multiplicado por tus 15000 facturas, son 99,9999 que al año sería 1199,9988 (1200 céntimos), o sea, en 180000 facturas (15000x12) habrá ganado 12 euros/dólares/loquesea al año.
Y cuarto, como dije al principio, todo depende de las necesidades que se tengan, no es lo mismo el redondeo de una factura (que va a 2 decimales), que los cálculos científicos de algún proyecto ultra preciso que se mide en micrómetros, por decir algo.
Y en este caso, el usuario necesitaba redondear a 2 decimales.
Aunque con la función que hemos presentado se puede redondear a los decimales que se necesite, que es de lo que se trata.




Cita:

Empezado por TheJHorse (Mensaje 438885)
Se que el tema esta ya tocado, pero quisiera reincidir en el ejemplo del amigo rrf, pero a solo 2 digitos, aca todos empiezan a nombrar y decir que no se aplica a la realidad, pero quisiera poner el siguiente ejemplo:

Un supermercado que gira facturas al dia en un promedio de 15000 facturas tan solo en uno de sus locales, donde calculos de total: 1.33333333 segun ustedes deberia ser redondeado a 1.33 donde claramente hay una perdida de 0.00333333 centavos para la empresa diario de 50 centavos, 1500 mensual, 18000 anual, tan solo de una sede; lleven el caso para un banco donde las transacciones son aun mayores.

No creo que se deba decir tan alegremente y confiadamente que algo no se aplica a la realidad, por que la realidad mis queridos amigos es absurdamente coherente.


Delphius 06-08-2012 21:07:03

Y para sumar a las palabras de Casimiro el valor mínimo de una moneda y la aplicación de redondeos está fijada por ley en cada país. En el caso de Argentina por ejemplo lo mínimo es el centavo, o dicho de otra manera la céntima parte del peso: 1/100 = 0,01. ¡Aunque hace años que no veo una monedita de 1 centavo! :D
Por tanto es imposible de cobrar diferencias menores. Y no es legal hablar de una precisión mejor que esa... ¿O es que realmente necesitas irte a las milésimas?
Respecto a los casos de redondeo, en este pedacito de tierra gobernado por una reinita bastante disparatada, existe una ley de redondeo a favor del cliente (ley 26179) que indica que toda diferencia menor a los 5 centavos y que no sea posible efectuar el vuelto la diferencia (el redondeo) sea a favor del cliente. Gracias a esa ley es que los números cuadran mucho mejor ya que se resumen a montos decimales en múltiplos de cinco (la mayoría de los casos :rolleyes: ) Al menos hasta que ya ni se encuentren las monedas de 5 centavos (que no falta mucho... si practicamente no hay monedas... ¿O acaso hay algo que se pueda comprar con 25 ctvs? :D :o )

Saludos fraccionados diría Al ;)

Chaja 30-05-2015 16:37:01

Hola...

Tratando desde hace tiempo encontrar solucion para este problema, veo que no fue solo a mi que se rompio la cebeza de como solucionarlo. Yo uso RoundTo(), pero a veces me falla. En definitiva cual es la rutina mas acertada para usar, despues de tantas explicaciones de Delphius, que quisiera que fuese mi socio por lo que sabe, y por que esta mas cerca de donde vivo, sin desmerecer a los demas. ejemplo tengo una cifra que es 45,555 y si la redondo a dos me queda 45,55.
Gracias a todos por existir....

Luis Roldan
Mar del Plata
Argentina

nlsgarcia 30-05-2015 17:45:38

Chaja,

Cita:

Empezado por Chaja
...uso RoundTo...pero a veces me falla...cual es la rutina mas acertada para usar...ejemplo tengo una cifra que es 45,555 y si la redondo a dos me queda 45,55...

:rolleyes:

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function RoundTo(F: single; D: integer): double;
var
   P : double;
begin
   P := Power(10, D);
   Result := Trunc(F * P + 0.5) / P;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   N1, N2 : Double;
   MsgUsr : String;

begin

   N1 := 45.555;
   N2 := RoundTo(N1,2);

   MsgUsr := 'N1 (Valor Original) = %g ' + #13#10 + #13#10 + 'N2 (Valor redondeado a 2 decimales) = %g';

   MessageDlg(Format(MsgUsr,[N1,N2]),mtInformation,[mbOK],0);

   N1 := 3.1415927;
   N2 := RoundTo(N1,3);

   MsgUsr := 'N1 (Valor Original) = %g ' + #13#10 + #13#10 + 'N2 (Valor redondeado a 3 decimales) = %g';

   MessageDlg(Format(MsgUsr,[N1,N2]),mtInformation,[mbOK],0);


end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Permite realizar redondeos por exceso, como se muestra en la siguiente imagen:



Nota : La función de redondeo del ejemplo fue tomada de : Como redondear a partir del numero 5 .

Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 23:17:45.

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