Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Arrotondamento currency

277 views
Skip to first unread message

Daniele

unread,
Oct 7, 2015, 9:43:01 AM10/7/15
to
Ciao a tutti,
domanda super trattata nei vari anni con soluzioni diverse e, devo dire,
mi sono un po perso tra le varie risposte.

Comunque ripropongo il quesito, nel caso mi sia sfuggito nelle risposte nei
vari post trovati.

Ho un currency impostato 66.825, con formatcurrency('#,###,##0.00',66825)
restituisce 66.82, ma la calcolatrice "commerciale" arrotonda a 66.83.

Ora lasciando perdere i vari criteri di arrotondamento usati, non c'e' un
modo spartano per far si che l'arrotondamento (in qualsiasi ultimo decimale
impostato) se
e' compreso ta 0..4 arrotonda in difetto altrimenti se e' compreso tra 5..9
in eccesso, come da approssimazione commerciale.

Tutto questo perche' nella classica stampa finale di una qualsiasi fattura,
a volte, per questo cacchio di approssimazione ho una differenza sul totale
di 1 centesimo
tra imponibile e imponibile + iva.
Ovviamente risolto con la dicitura "arrotondamento' ... l'intenzione e'
evitare di inserirla.

Grazie

Daniele




4ndre4

unread,
Oct 7, 2015, 11:59:07 AM10/7/15
to
On Wednesday, 7 October 2015 10:43:01 UTC+1, Daniele wrote:

[...]
> e' compreso ta 0..4 arrotonda in difetto altrimenti se e' compreso tra 5..9
> in eccesso, come da approssimazione commerciale.

http://docwiki.embarcadero.com/Libraries/XE7/en/System.Round
http://docwiki.embarcadero.com/Libraries/XE7/en/System.Math.RoundTo
http://docwiki.embarcadero.com/Libraries/XE7/en/System.Math.SimpleRoundTo



Daniele

unread,
Oct 7, 2015, 2:05:50 PM10/7/15
to
Ciao,
grazie per la risposta.... ma come puoi leggere anche tu il problema e'
che usano un arrotondamento al numero intero piu' vicino e
se e' esattamente in mezzo (5) arrotondano al numero dispari piu' vicino
(5.55 = 5.50 anziche' 5.60 e 5.65 = 5.70 corretto) che e' quello che devo
evitare.

Grazie per l'interesse

Daniele



Morde

unread,
Oct 7, 2015, 2:15:00 PM10/7/15
to
Il 07.10.2015 11:42, Daniele ha scritto:
> Ora lasciando perdere i vari criteri di arrotondamento usati, non c'e'
> un modo spartano per far si che l'arrotondamento (in qualsiasi ultimo
> decimale impostato) se
> e' compreso ta 0..4 arrotonda in difetto altrimenti se e' compreso tra
> 5..9 in eccesso, come da approssimazione commerciale.


System.Math.SimpleRoundTo

--
Morde

Giacomo Degli Esposti

unread,
Oct 7, 2015, 2:15:04 PM10/7/15
to
On Wednesday, October 7, 2015 at 4:05:50 PM UTC+2, Daniele wrote:
> Ciao,
> grazie per la risposta.... ma come puoi leggere anche tu il problema e'
> che usano un arrotondamento al numero intero piu' vicino e
> se e' esattamente in mezzo (5) arrotondano al numero dispari piu' vicino
> (5.55 = 5.50 anziche' 5.60 e 5.65 = 5.70 corretto) che e' quello che devo
> evitare.

Non proprio... se rileggi attentamente la documentazione delle tre
funzioni che ti ha indicato, vedrai che una delle tre non usa l'arrotondamento del banchiere (che cmq arrotonda al /pari/ piu' vicino,
non al dispari) ma proprio il classico arrotondamento "all'antica" che
serve a te.

ciao
Giacomo


4ndre4

unread,
Oct 7, 2015, 2:17:12 PM10/7/15
to
On Wednesday, 7 October 2015 15:05:50 UTC+1, Daniele wrote:

[...]
> (5.55 = 5.50 anziche' 5.60 e 5.65 = 5.70 corretto) che e' quello che devo
> evitare.

Costruisci la tua routine. Considera, pero`, che il banker's rounding e` l'algoritmo migliore di arrotondamento, quando si lavora con i soldi.


Daniele

unread,
Oct 7, 2015, 5:09:59 PM10/7/15
to
Un saluto a tutti,
in termini pratici quello che sto cercando di risolvere, ma ormai ci
rinuncio, e' questa situazione capitata giusto oggi risolta con gli
arrotondamenti.

ho 4 prodotti

prezzo quantita' iva imponibile iva totale

12.15 5 10 60.75 6.08
66.83
10.94 5 10 54.70 5.47
60.17
8.90 5 10 44.50 4.45
48.95
8.99 5 10 44.95 4.50
49.45

totale Imponibile = 204.90
totale iva = 20.50
Totale = 225.40

Arrotondamento = -0.01


ma 204.90 + 10% = 225.39

> Costruisci la tua routine. Considera, pero`, che il banker's rounding e`
> l'algoritmo migliore di arrotondamento, quando si lavora con i soldi.
Io sto usando ben quello .... pero' ogni tanto ho questa situazione.

Grazie a tutti per l'interesse.

4ndre4

unread,
Oct 7, 2015, 6:00:16 PM10/7/15
to
On Wednesday, 7 October 2015 18:09:59 UTC+1, Daniele wrote:

[...]
> totale Imponibile = 204.90
> totale iva = 20.50
> Totale = 225.40
>
> Arrotondamento = -0.01
> ma 204.90 + 10% = 225.39

Il totale IVA, se applichi il 10%, non e` 20.50, ma 20.49. E` chiaro che se sommi valori gia` arrotondati, non farai altro che propagare l'errore.

jugin

unread,
Oct 7, 2015, 6:45:37 PM10/7/15
to
On Wed, 7 Oct 2015 19:09:56 +0200, "Daniele" <i...@io.it> wrote:

Ho rifatto quella fattura con il mio gestionale.
L'iva al 10% su 204,90 viene 20,49.
io non stampo in fattura l'arrotondamento.

ca75

unread,
Oct 7, 2015, 8:13:46 PM10/7/15
to
4ndre4 ha scritto:
Posso chiederti come funzione il banker's rounding?

non ho capito il problema ma lo avrei risolto in questi modo

procedure TForm1.Button1Click(Sender: TObject);
Function Arrotonda(numero:Single;Cifre,LimiteInferiore : Integer):String;
Var App1 : Integer;
App2 : Single;
Begin
App2 := Trunc(Numero*Power(10,Cifre));
App1 := Trunc(Numero*Power(10,Cifre+1)) Mod 10;
if (App1>LimiteInferiore) Then
Begin
App2 := App2 + 1
End;
Arrotonda := FloatToStr(App2 / Power(10,Cifre));
End;

begin
Caption := Arrotonda(3.4567345,3,5);
end;





--
-------------------------------
per scrivere in privato
togliere "1975nosp"

to reply remove "1975nosp"

---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus

4ndre4

unread,
Oct 7, 2015, 8:34:58 PM10/7/15
to
On Wednesday, 7 October 2015 21:13:46 UTC+1, ca75 wrote:

[...]
> Posso chiederti come funzione il banker's rounding?

http://bfy.tw/1p06

> non ho capito il problema ma lo avrei risolto in questi modo

Se non hai capito il problema, come fai a proporre una soluzione?

> Function Arrotonda(numero:Single;Cifre,LimiteInferiore : Integer):String;
[...]

Non serve reinventare la ruota, le funzioni di arrotondamento esistono gia` in Delphi, e il problema specifico che Daniele sta avendo e` dovuto al fatto che arrotonda i valori intermedi e li somma. A quel modo, avra` sempre risultati di molto distanti dal valore corretto, e dovra` fare correzioni in piu` o in meno. I valori vanno sempre sommati NON arrotondati, e poi si arrotonda il totale.
Queste dovrebbero essere le basi per qualunque programmatore.

ca75

unread,
Oct 7, 2015, 8:53:53 PM10/7/15
to
4ndre4 ha scritto:
> On Wednesday, 7 October 2015 21:13:46 UTC+1, ca75 wrote:
>
> [...]
>> Posso chiederti come funzione il banker's rounding?
>
> http://bfy.tw/1p06
>
>> non ho capito il problema ma lo avrei risolto in questi modo
>
> Se non hai capito il problema, come fai a proporre una soluzione?

ho perso un pezzo della frase, non ho capito la storia
dell'arrotondamento del banchiere. Rispetto ad uno matematico cosa cambia?

> Non serve reinventare la ruota, le funzioni di arrotondamento esistono gia` in Delphi,....

ho solo messo una cosa che non c'era, la possibilità di cambiare il
limite dell'ultima cifra oltre il quale arrotondare alla cifra superiore.

4ndre4

unread,
Oct 7, 2015, 9:06:04 PM10/7/15
to
On Wednesday, 7 October 2015 21:53:53 UTC+1, ca75 wrote:

[...]
> ho perso un pezzo della frase, non ho capito la storia
> dell'arrotondamento del banchiere. Rispetto ad uno matematico cosa cambia?

Cosa sarebbe un arrotondamento matematico?

> ho solo messo una cosa che non c'era, la possibilità di cambiare il
> limite dell'ultima cifra oltre il quale arrotondare alla cifra superiore.

http://docwiki.embarcadero.com/Libraries/XE7/en/System.Math.RoundTo

"ADigit indicates the power of ten to which you want AValue rounded. It can be any value in the range from -20 through 20."

4ndre4

unread,
Oct 7, 2015, 9:07:07 PM10/7/15
to
On Wednesday, 7 October 2015 22:06:04 UTC+1, 4ndre4 wrote:

[...]
> "ADigit indicates the power of ten to which you want AValue rounded. It can be any value in the range from -20 through 20."

E cambiare il limite non serve, dal momento che il banker's rounding e` l'algoritmo di arrotondamento ottimo.

enrico....@gmail.com

unread,
Oct 7, 2015, 9:56:24 PM10/7/15
to
Ciao Daniele,
> totale Imponibile = 204.90
> totale iva = 20.50
> Totale = 225.40
>
> Arrotondamento = -0.01
>
>
> ma 204.90 + 10% = 225.39
>

ma se fai una semplice operazione del tipo : 204,90 * 10 / 100 ti da 20,49 e non 20,50 come dici tu, per cui, secondo me, devi rivedere il calcolo.

Ciao da Enrico.

Luigi Siciliano

unread,
Oct 8, 2015, 7:07:15 AM10/8/15
to
Il 07/10/2015 19.09, Daniele ha scritto:
> Un saluto a tutti,
> in termini pratici quello che sto cercando di risolvere, ma ormai ci
> rinuncio, e' questa situazione capitata giusto oggi risolta con gli
> arrotondamenti.
>
> ...
>
> totale Imponibile = 204.90
> totale iva = 20.50
> Totale = 225.40
>

Fai pace con te stesso, NON sarai mai sanzionato per aver addebitato 1
centesimo in più o in meno in una fattura anche perché l'errore di
arrotondamento ci sta tutto.

Non sai quanti errori di "arrotondamento" ci stanno nelle fatture
scritte manualmente da operatori che, purtroppo, poco scolarizzati ma,
devo riconoscere, anche "fortemente scolarizzati" (e mi riferisco a
laureati 110 e lode che NON sanno fare a mano le 4 operazioni e NON
sanno usare una calcolatrice:) ).

In ogni caso se il layout della tua fattura prevede il calcolo dell'iva
su ogni riga della fattura, vai tranquillo a stampare il dettaglio
dell'iva come sommatoria delle colonne imponibile ed iva
(rispettivamente 204.90 e 20.50) se, invece, il tuo layout prevede solo
l'esposizione dell'imponibile in ogni riga allora, vai tranquillo a
stampare il dettaglio iva con la sommatoria dell'imponibile (204.90),
dell'iva calcolata (20.49) così che rispettivamente avrai le fatture con
un totale diverso, nel primo caso 225.40 e nel secondo 225.39.

Ripeto NON sarai mai sanzionato e NESSUNO dei clienti si ribellerà ad
una o all'altra fattura.

Parola di consulente (se conta qualcosa ;)).

Ciao.

4ndre4

unread,
Oct 8, 2015, 8:40:46 AM10/8/15
to
On Thursday, 8 October 2015 08:07:15 UTC+1, Luigi Siciliano wrote:

[...]
> (rispettivamente 204.90 e 20.50) se, invece, il tuo layout prevede solo

L'IVA e` 20.49, non 20.50


Luigi Siciliano

unread,
Oct 8, 2015, 9:34:17 AM10/8/15
to
Mi riferivo alla somma della colonna IVA della tabella postata da Daniele:
> prezzo quantita' iva imponibile iva >
> 12.15 5 10 60.75 6.08
> 10.94 5 10 54.70 5.47
> 8.90 5 10 44.50 4.45
> 8.99 5 10 44.95 4.50

Ripeto: NESSUNA norma ti sanzionerà mai per questioni sull'arrotondamento.

Ciao.

Daniele

unread,
Oct 8, 2015, 11:30:00 AM10/8/15
to
Ciao tutti,
il problema e' lo ha identificato ben bene Luigi.

Riga per riga si deve indicare prezzo unitario, quantita', imponibile, iva
applicata , valore dell'iva, totale.
Ovviamente per forza che riga per riga esistono gli arrotondamenti che,
anche qui per forza, si portano dietro.
L'erorre, quando si manifesta, e' sempre sul doppio controllo somma dei
totali riga con imponibile + iva nel totale documento
ed e' sempre di +/- 1 centesimo.

Una soluzione approvata in mattinata e' quella di NON indicare il totale su
ogni riga e di fare il "totalone" alla fine, come nelle
fatture che riceviamo. In questo caso niente piu' problemi, un solo valore
su cui calcolare l'iva e poi sommarlo.

Ancora grazie a tutti.

Daniele







4ndre4

unread,
Oct 8, 2015, 12:06:53 PM10/8/15
to
On Thursday, 8 October 2015 10:34:17 UTC+1, Luigi Siciliano wrote:

[...]
> Ripeto: NESSUNA norma ti sanzionerà mai per questioni sull'arrotondamento.

Non si tratta di essere sanzionati, si tratta di riportare i numeri corretti e di fare le cose come Cristo comanda. I calcoli intermedi non vanno MAI approssimati. Sono i risultati che si approssimano. Si chiama propagazione dell'errore ed e` una cosa che un programmatore dovrebbe conoscere bene.

4ndre4

unread,
Oct 8, 2015, 12:08:19 PM10/8/15
to
On Thursday, 8 October 2015 12:30:00 UTC+1, Daniele wrote:

[...]
> Una soluzione approvata in mattinata e' quella di NON indicare il totale su
> ogni riga e di fare il "totalone" alla fine, come nelle

Certo che non si indica il totale su ogni riga! Si arrotonda solo il totale!
E c'era bisogno addirittura di "approvarlo"? LOL...

Luigi Siciliano

unread,
Oct 8, 2015, 1:11:17 PM10/8/15
to
Il 08/10/2015 14.06, 4ndre4 ha scritto:
> On Thursday, 8 October 2015 10:34:17 UTC+1, Luigi Siciliano wrote:
>
> [...]
>> Ripeto: NESSUNA norma ti sanzionerà mai per questioni sull'arrotondamento.
>
> Non si tratta di essere sanzionati, si tratta di riportare i numeri corretti e di fare le cose come Cristo comanda.
>
Lascia Cristo dove sta ;) qui comanda l'ADE e, credimi, non gliene frega
nulla di un arrotondamento da UN centesimo! anche perché, nelle
dichiarazioni scrivi sempre numeri arrotondati all'euro, per eccesso o
per difetto.

> I calcoli intermedi non vanno MAI approssimati. Sono i risultati che si approssimano.
>
La determinazione dell'importo dell'IVA su una fattura che lo espone, è
allo stesso tempo "risultato" che "calcolo intermedio" per cui vale
quando già ho detto nell'altro post.

Prova a ragionare, se facessimo come dici tu, NON dovremmo arrotondare
al secondo decimale neanche l'imponibile di ogni riga perché anche in
questo caso sarebbe "calcolo intermedio" per cui NON andrebbe
"approssimato" e quindi NON se ne uscirebbe:
NON potresti decidere quale sarebbe la giusta somma dell'imponibile da
esporre in fattura! ;)


>Si chiama propagazione dell'errore ed e` una cosa che un programmatore dovrebbe conoscere bene.
>

Ma che, IMHO, va adattata al caso concreto, che è la fattura:
Nel peggiore dei casi, potresti avere *un* centesimo di arrotondamento
per ogni riga di fattura. Ma una fattura NON ha mai un numero di righe
tali da avere UNO o più euro di arrotondamento, anzi! ;)

L'esperienza mi dice che, generalmente, l'arrotondamento per eccesso di
una riga viene compensato dall'arrotondamento in difetto di un'altra
riga e sul totale tale arrotondamento potrebbe addirittura risultare
neutro o comunque *trascurabile*.

Diverso sarebbe il caso di una serie di calcoli concatenati che se
basati su importi arrotondati invece che reali verrebbe fuori un
risultato completamente diverso.

Ciao.

Luigi Siciliano

unread,
Oct 8, 2015, 1:36:06 PM10/8/15
to
Il 08/10/2015 15.11, Luigi Siciliano ha scritto:
> quando già ho detto nell'altro post.

naturalmente è "quanto già detto..."


4ndre4

unread,
Oct 8, 2015, 1:40:17 PM10/8/15
to
On Thursday, 8 October 2015 14:11:17 UTC+1, Luigi Siciliano wrote:

[...]
> Lascia Cristo dove sta ;) qui comanda l'ADE e, credimi, non gliene frega
> nulla di un arrotondamento da UN centesimo! anche perché, nelle
> dichiarazioni scrivi sempre numeri arrotondati all'euro, per eccesso o
> per difetto.

Ma chi se ne frega se gliene freghi niente a qualcuno! Si tratta di fare i calcoli correttamente e semplificarsi la vita! NON si arrotondano i totali parziali, si arrotonda il totale finale. Tanto e` vero che questa e` la soluzione che adesso all'OP e` stato detto di adottare.

> La determinazione dell'importo dell'IVA su una fattura che lo espone, è
> allo stesso tempo "risultato" che "calcolo intermedio" per cui vale
> quando già ho detto nell'altro post.

Vale quanto ho scritto nel periodo precedente.

> Prova a ragionare, se facessimo come dici tu, NON dovremmo arrotondare
> al secondo decimale neanche l'imponibile di ogni riga[...]

Se il formato di visualizzazione e` a due cifre, la terza la devi per forza arrotondare. Quello che non devi arrotondare e` 20.49 in 20.50. Non hai capito il punto.

> Ma che, IMHO, va adattata al caso concreto, che è la fattura:

Non si adatta niente. Il principio vale comunque e sempre.

Daniele

unread,
Oct 8, 2015, 1:46:08 PM10/8/15
to
Ciao,


[...]
> Una soluzione approvata in mattinata e' quella di NON indicare il totale
> su
> ogni riga e di fare il "totalone" alla fine, come nelle

>> Certo che non si indica il totale su ogni riga! Si arrotonda solo il
>> totale!
>> E c'era bisogno addirittura di "approvarlo"? LOL...

Sebbene sia difficile capirlo ..... qui la questione sta andando ancora
avanti con le ragioniere.
C'e' qualcuno/a che non capisce, ancora, come mai sballa 1 centesimo.

Da parte mia, questione chiusa ... :-)

Ciao

Daniele



Luigi Siciliano

unread,
Oct 8, 2015, 1:50:29 PM10/8/15
to
Ok, Ciao.

Warp10

unread,
Oct 8, 2015, 1:58:18 PM10/8/15
to
Il 08/10/2015 15.46, Daniele ha scritto:

> Sebbene sia difficile capirlo ..... qui la questione sta andando ancora
> avanti con le ragioniere.

Spero, per te, non siano della stessa risma del ragioniere che ho
incrociato io che prese la calcolatrice per calcolare "100 - 80" non
fidandosi di ciò che io gli dicevo. :)

--
@WarpTen10

4ndre4

unread,
Oct 8, 2015, 3:29:05 PM10/8/15
to
On Thursday, 8 October 2015 14:46:08 UTC+1, Daniele wrote:

[...]
> C'e' qualcuno/a che non capisce, ancora, come mai sballa 1 centesimo.

E` difficile farlo capire a certi programmatori, figuriamoci a delle segretarie.


0 new messages