Newsgroup: it.comp.lang.delphi
Titolo: RoundTo

Volevo fare un'osservazione
La RoundTo è soggetta all'architettura della CPU (almeno credo)
Ad esempio sul mio pc (P3 1GHz)
RoundTo(1.245, -2)   =  1,25
RoundTo(12.245, -2) =  12,24
RoundTo(120.245, -2) =  120,25
RoundTo(1200.245, -2) =  1200,24
Il comportamento secondo me è anomalo...
...ma potrebbe non essere lo stesso su un altro processore.
Voi che ne pensate?
E' corretto usare RounTo per campi valuta?
Ciao

 ha scritto:

prova questa
function convert(x:real;decimali:integer):real;
begin
   x := exp(decimali*ln(10))*x;
   x := x * 100;
   x := round(x);
   x := x / exp(decimali*ln(10));
   convert := x / 100;
end;
procedure TForm1.Button1Click(Sender: TObject);
var c1 : Real	;
begin
  c1 := 1.245;    Label1.Caption := FloatToStr(RoundTo(c1, -2));
  c1 := 12.245;   Label2.Caption := FloatToStr(RoundTo(c1, -2));
  c1 := 120.245;  Label3.Caption := FloatToStr(RoundTo(c1, -2));
  c1 := 1200.245; Label4.Caption := FloatToStr(RoundTo(c1, -2));
  c1 := 1.245;    Label5.Caption := FloatToStr(convert(c1, 2));
  c1 := 12.245;   Label6.Caption := FloatToStr(convert(c1, 2));
  c1 := 120.245;  Label7.Caption := FloatToStr(convert(c1, 2));
  c1 := 1200.245; Label8.Caption := FloatToStr(convert(c1, 2));
end;
ciao
-- 
------------------------------------------------
Per rispondere in privato togliere add1975
Creato con M2, il rivoluzionario client e-mail di Opera: 
http://www.opera.com/m2/

Per delphi 2 (cambiano i formati dei tipi):
function convert(x:double;decimali:integer):double;
begin
   x := exp(decimali*ln(10))*x;
   x := x *100;
   x := round(x);
   x := x / exp(decimali*ln(10));
   convert := x/100;
end;
procedure TForm1.Button1Click(Sender: TObject);
var c1 : double	;
begin
  c1 := 1.245;    Label1.Caption := FloatToStr(convert(c1, 2));
  c1 := 12.245;   Label2.Caption := FloatToStr(convert(c1, 2));
  c1 := 120.245;  Label3.Caption := FloatToStr(convert(c1, 2));
  c1 := 1200.245; Label4.Caption := FloatToStr(convert(c1, 2));
end;--



Il problema sono le approssimazioni dovute al sistema di rappresentare i
numeri in virgola mobile. Quindi, piu' che dal processore, dipendera' dallo
standard utilizzato per la memorizzazione del dato.
Tutte le cifre che tu hai scritto, vengono convertite in formato IEEE.
Cio' significa che, ad esempio, il 12.245 possa venir trasformato in un
12.24499999999999999999(eccetera), facendo in modo che il RoundTo
approssimi per difetto
Ciao,
Stefano

La RoundTo è soggetta all'architettura della CPU (almeno credo)
Giusta osservazione :)
Se leggi la guida della funzione in oggetto, vedi che l'ultima frase annotata
dice: "The behavior of RoundTo can be affected by the Set8087CW procedure or
SetRoundMode function."
Per circostanziare meglio questo utilizzo, approfondisci e la piu' importante
*SetRoundMode*, e in seconda battuta la Set8087CW.
Ciao
-- 
Morde. 
(
mo...@despammed.com
)
M-List di icld: 
http://it.groups.yahoo.com/group/icld/

 
Tutto vero, ma gli esempi citati credo dipendano piu' da un problema di
approssimazione che da una impostazione della control word del coprocessore
matematico
Ciao,
Stefano

matematico
Si, infatti stavo facendo delle prove anche con SetPrecisionMode e mi ritorna
valori diversi infischiandosene del roundto.
SetPrecisionMode(pmDouble);
RoundTo(1.245, -2) = 1,25
RoundTo(12.245, -2) = 12,24
RoundTo(120.245, -2) = 120,24
RoundTo(1200.245, -2) = 1200,24
invece se faccio
SetPrecisionMode(pmSingle);
ottengo
RoundTo(1.245, -2) = 1,24000000802816
RoundTo(12.245, -2) = 12,2399996636037
RoundTo(120.245, -2) = 120,239997453337
RoundTo(1200.245, -2) = 1200,23994958086
Mentre per quanto riguarda la Set8087CW procedure sembra che sia utilizzata
piu' che altro per l'opengl, quindi esula dal nostro discorso degli
arrotondamenti.



Cosa usate di solito per gestire campi valuta o iva etc..?
Io fino ad oggi ho usato la formatfloat ma è un pochino scomoda...


Direi che Currency e' il formato adatto.
Se poi hai necessita' di approssimazioni particolari, puoi usare gli Int64.
Ciao,
Stefano

Cosa usate di solito per gestire campi valuta o iva etc..?
Double.
