Newsgroup: it.comp.lang.delphi
Titolo: [D5] "curiosità" sulla procedura ROUND

Ciao a tutti.
Ho notato questa particolarita' della procedura Round:
(esempio di codice)
a:=0.5;
edit1.text:=IntToStr( Round(a) );
in questo caso edit1 contiene 0: la round non dovrebbe arrotondare per
eccesso? " a " era di tipo reale, ho provato con double, real, extended, con
stesso risultato.
Poi ho cambiato il valore di " a " ed ho ottenuto i seguenti risultati:
a:=1,5; -> 2
a:=2,5; -> 2
a:=3,5; -> 4
a:=4,5; -> 4
a:=5,5; -> 6
a:=6,5; -> 6
a:=7,5; -> 8
a:=8,5; -> 8
a:=9,5; -> 10
E' forse un bug della procedura round?
Come faccio ad ottenere un arrotondamento SICURO?
Grazie
  Fodox

 Come faccio ad ottenere un arrotondamento SICURO?
C'è una SetRoundMode, ma io non l'ho mai usata ...
HTH
--
Andrea /\/\agni
ICQ#: 174108000

> C'č una SetRoundMode, ma io non l'ho mai usata ...
Dove la trovo la SetRoundMode? Nell'help in linea non l'ho trovata; sta
forse in una versione + nuova di Delphi?
Grazie cmnq!
Fodox

 C'è una SetRoundMode, ma io non l'ho mai usata ...
Ma la sera prima di andare a letto ti leggi un pò di VCL? Le sai proprio
tutte!! :-))
-- 
Lis
ICQ@Home #7317603sette     ICQ@Work #16285702tre
Mercatino: 
http://lis77.bravepages.com
 (aggiornato *con foto*: 16/06/03)

 sta forse in una versione + nuova di Delphi?
La unit č la Math. In D6 sono sicuro che c'č...
Cmq puoi dare un'occhiata qua:
http://homepages.borland.com/efg2lab/Library/Delphi/MathFunctions/Rounding.p
as.TXT
HTH :-)



Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

 as.TXT
su questo link probabilmente ho trovato la soluzione al mio problema. Ti
ringrazio!
Ciao ciao
   Fodox

 esempio a livello fiscale, usa la procedure SimpleRoundTo().
Si, intendo a livello fiscale dato che sto realizzando un gestionale.
In D5 non ho trovato la SimpleRoundTo, quindi presuppongo che sia in una
versione + nuova.
Grazie ugualmente,
  ciao ciao
Fodox

 una versione + nuova.
Sě, scusami ma ho controllato in questo momento ed effettivamente č
cosě.
Ad ogni modo, l'implementazione della funzione č simile, se non identica
ad una routine che mi ero fatto da solo quando la SimpleRoundTo ancora
non esisteva.
Comunque, ti scrivo qui di seguito il codice della SimpleRoundTo che di
certo č piů affidabile cosě che tu possa implementarla nella tua
applicazione.
====================
function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange
= -2): Double;
var
  LFactor: Double;
begin
  LFactor := IntPower(10, ADigit);
  Result := Trunc((AValue / LFactor) + 0.5) * LFactor;
end;
====================


 applicazione.
[cut]
Grazie tante!
   Ciao ciao

 ....e su D5 sono sicuro che NON c'e'! :PPP
*Credo* che math.pas ci sia dalla versione Pro in su (cioe' e esclusa
dalla Personal o come diavolo si chiamava)
Saluti
Paolo Arosio

 ====================
Ciao!
Ho notato che per numeri negativi l'arrotondamento non funziona. Io l'ho
corretto in questo modo:
==========================
 function SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange
= -2): Double;
 var
   LFactor: Double;
   NEG : integer;
 begin
   if AValue<0 then NEG:=-1 else NEG:=1;
   AValue:=AValue * NEG;
   LFactor := IntPower(10, ADigit);
   Result := Trunc((AValue / LFactor) + 0.5) * LFactor * NEG;
 end;
==========================
Cosa ne pensi?
Ciao ciao
  Fodox

 Cosa ne pensi?
Purtroppo non ho il tempo di provarlo...ma se tu l'hai gią collaudato e
confermi che funziona, non posso fare altro che complimentarmi. ;-)
