Newsgroup: it.comp.lang.visual-basic
Titolo: [ ! ] per convertire in Euro con la Round

Ciao a tutti,
piu' che un bug ritengo sia un utile suggerimento.
Utilizzando la Round ( Lire / 1936.27 , 2 ) per calcolare un prezzo in Euro, ho
notato che in pochi casi particolari si verifica un errore di arrotondamento. (
VB6 + SP5 + Win ME e 2K)
Esempio: la Round applicata a 2,345 o 2,345000000 mi da' 2,34 (Errato).
Se invece facessi 2,34500001 allora mi da 2,35 (Corretto).
E' sufficiente quindi sommare 0,0001 (per arrotondare alla terza cifra) al
valore passato alla Round come primo argomento: Round ( Lire / 1936.27 + 0.0001
, 2 )
L'errore si presenta quando si ha a che fare con numeri a 3 cifre decimali
significative e le ultime due sono 05 o 45. ( x,x05 oppure x,x45 oppure
x,x45000... ).
E' un errore di soltanto un centesimo, ma in una somma di 100 errori gia' ci
sta quasi un cappuccino ed una brioche a colazione.
Nel caso abbia detto delle cavolate, per favore comunicatemelo e vi paghero' il
cappuccino con brioche. Grazie.
and...@infsurfista.it
-- 
Posted from 
ppp-145-53.27-151.libero.it
 [151.27.53.145] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 wrote in message
fa81d1da14dc0744a55...@mygate.mailgate.org...


 Te dove hai trovato l'errore????
Supponiamo di creare una funzione NuovaRound che lavori come indicato, cioč
sommi 0,0001 ad un numero e poi utilizzi Round per applicare
l'arrotondamento.
Allora:
NuovaRound(1.345,2) = 1.35
Corretto!
NuovaRound(1.3449,2) = 1.35
Errato!
Quando la coperta č corta, per coprire la testa bisogna scoprire i piedi :-)
Ciao,
Carlo.

 A quanto pare per me la coperta è abbastanza lunga!!!!!!! ;)
Il solito fortunato!... ;-)
Ciao

 wrote in message
9tit0o$fu3$1...@pegasus.tiscalinet.it...

Ma dai non può essere fortuna..... ;)
Ora ti spiego perchè:
valore = 1.3449 + 0,0001       'Valore sarò 1,3450
Round(valore, 2) = 1,34          'Esatto proprio perchè round arrotonda il 5
in difetto
mentre:
valore = 1.345 + 0,0001       'Valore sarò 1,3451
Round(valore, 2) = 1,35        'Esatto
No????
Ho provato anche con Win 2k e funziona bene!!!!
Ciao
Dodoxxx
d.ca...@cogito-italia.com

 Ma dai non può essere fortuna..... ;)
[...]
Certo, la fortuna non c'entra. Prima ho sbagliato esempio ma pensavo che il
concetto fosse chiaro lo stesso.
Prova un po' questo numero:
1,0549
Round(1,0549) = 1,05    (corretto)
NuovaRound(1,0549) = 1,06    (errato)
Il concetto è che voi usate proprio l'errore della funzione per compensare
il risultato!
Il ragionamento sarebbe sbagliato anche se foste sicuri di non incappare nel
valore del mio esempio, perché come potete essere certi che il bug della
Round si limiti ai dati che espongono un 5 nella cifra decimale meno
significativa (rispetto a quella richiesta alla funzione)?
Una soluzione purtroppo non ce l'ho, e dico purtroppo perché l'Euro è alle
porte e la Round servirà un po' a tutti, credo...
Andrò a vedere se MSDN fornisce lumi...
Ciao,
Carlo.

:-((((((((((((((
Hai proprio ragione!!!!!!!!!
Grazie Mille!!!!!!!!!!!!
Ora penso di fare ciň che non avrei voluto fare....
Creare un ALGORITMO apposito!!!!!! :-(((((((((
ciao
Dodoxxx

 Creare un ALGORITMO apposito!!!!!! :-(((((((((
Questa č un'ottima idea!
Ciao e buon lavoro,
Carlo.

Dopo molte prove usando Round ho notato la sua inaffidabilità ed ho deciso
di seguire un'altra strada.
Round(1.115,2) = 1,12
Round(1.015,2) = 1,01
Ho convertito un gestionale in euro ed ho usato Format(mionumero, "#,#0.00")
funziona tutto al 100% anche perchè nessun cliente ha chiesto la mia
testa!!! :-))
Ciao, VincePik

Ciao,
volevo un chiarimento sull'arrotondamento Euro.
Mi pare di aver capito che bisogna arrotondare alla terza cifra decimale.
Due interpretazioni:
- prendo le cifre decimali, ne cosidero solo 3, arrotondo.
- prendo le cifre decimali, le considero tutte, arrotondo fino a lasciarne 2.
Ne viene fuori che:
1.3449 nel primo caso lo considero 1.344 e risulta 1.34
nel secondo caso lo considero 1.3449 e risulta 1.35
qual'e' quella giusta? Guardando in giro nei vari opuscoli e siti che parlano 
di arrotondamento o sempre trovato esempi solo con 3 cifre decimali.
Resta comunque il fatto che sommare 0.0001 e' propio uno sfruttamento 
dell'approssimazione per difetto della Round.
Alla prossima.
-- 
Posted from 
ppp-211-54.27-151.libero.it
 [151.27.54.211] 


 wrote in message
ntbL7.7622$BA4.2...@news1.tin.it...


 ha scritto nel messaggio
news:9tj5nq$l3k$1...@pegasus.tiscalinet.it...


Per il maledettissimo EURO questo è errato:
?Round(19.2350000,2)
 19.24
e questo corretto:
?Round(19.2350000,2)
 19.24
Quando la terza cifra decimale è 5 la si arrotonda per eccesso ;(
Buona Fortuna
Dodoxxx

No scusami, ho sbagliato!!!!!
Sto proprio fuori!!!!!!!!
Sarà che sono le 15:15 di venerdi....
Non badate a ciò che ho scritto sopra!!!!!!!
Ti funziona correttamente!!!!!!!!!!!
Complimenti
Ciao
Dodoxxx

 ha scritto nel messaggio
news:071c3f59381c583a76d...@mygate.mailgate.org...


 ha scritto nel messaggio
news:9tlkk5$204$1...@fe1.cs.interbusiness.it...


Allora, io ho risolto cosě.. ma c'e' un altro problema...
Public Function EuroRound(n As Double, ndec As Integer) As Double
Dim TempN As Double
Dim TempD As Single
Dim TempI As Long
Dim ToAdd As Integer
Dim mystr As String
    TempN = n * 10 ^ ndec                             'lo fo grosso
    TempI = Fix(TempN)                               'recuepro l'intero
    TempD = (TempN - TempI)                             'e i decimali
    If TempD >= 0.5 Then ToAdd = 1 Else ToAdd = 0        'se c'e' un resto
di piů di 0,5...
    TempN = (TempI + ToAdd)
    EuroRound = TempN * 0.1 ^ (ndec)
End Function
funzia corerttamente, ma attenzione: se definite le variabili come double
avrete degli errori astrusi. es:
euroround (4,435)
tempN diventa 443,5
tempiI 443
tempD 0,4999999999993
evidentemente per il tipo di dati double la matematica č un opinione :-)

Allora, nel regime euro, i prezzi delle "cose", ovvero i valroi indicati su
documenti fiscalmetne rilevanti devono essere arrotnodati a due cifre
decimali, con lo 0,5 per eccesso.
13,0545 è 13,054
13,0544 è 13,54
13,0549999999999999999 è 13,54 (e qui state attenti ad usare i double)
13,0545555555555555551 è 13,054
13,0545555555555555556 è 13,055 (quidni state attenti ad usare la round)
nel caso di listini prezzi e quant'altro che necessariamente debbano
indicare prezzi attualmente significativi alla lira, o si indicano i prezzi
per decine, centinaia, migliia di unità, o si aumentano le virgole.
La nota ministeriale definisce comunque il numero dei decimali da utilizzare
per la conversione: nei calcoli interni (ciè non nei valori finali di
contabilità, fatture, dichiarazioni fiscali, ecc.) devono essere utilizzati,
qualora i singoli valori siano significativi:
all'unità di lira -> 5 decimali
alle decine di lire -> 4 decimali
alle centinaia di lire -> 3 decimali
alle migliaia di lire -> 2 decimali
a parte il problema della conversione, comunque, si opssono utilizzare
quanti decimali si vogliono, internamente, basta che i documenti ufficiali
siano a due decimali.
Ad esempio io posso vendere un bicchiere di carta a 1 lira. Se converto il
prezzo lire ->euro (esempio nel caso del dual display in fattura), avro'
0,00052 (in realtà sarebbe 0,0005164...) Nessuno mi vieta però, in regime di
solo euro, di avere un prezzo unitario, solo in euro,  di 0,0005164
Resta ovviamente il problema che, venute 135 confezioni da 25 bicchieri (ad
esempio), avrò: un totale di 17.4285 euro, che dovrà essere arrotondato, in
una eventuale fattura, a 17.43.
Mentre le stesse confezioni aftturate a 0,00052 (perché in regime di dual
display) darebbero17,55 euro.
1250*30*0.0005164=
Spero di essere stato chiaro

 ha scritto nel messaggio
news:ntbL7.7622$BA4.2...@news1.tin.it...

per la visualizzaizone ok, ma per la gestione del dato? Cosa fai riconverti
la stringa in numero?
del tipo
a,b as single
a=valore da arrotondare
b=cdbl(format(a,"#,#0.00")?

 solo euro, di avere un prezzo unitario, solo in euro,  di 0,0005164
Non ci siamo...
Ho postato un riassunto completo poco fa, rimando tutti quanti là per
delucidazioni.
Ciao,
Carlo.

In tutto questo parlare di presunti errori della funzione Round
vorrei precisare che questa funziona benissimo, solo che usa
l'arrotondamento all'americana, secondo cui se l'ultima cifra è
5 l'arrotondamento sarà per eccesso o per difetto a seconda che
la penultima cifra sia pari o dispari. Provare per credere!
-- 
Samuele Battarra
prova il mio newsreader:
http://digilander.iol.it/battarsa/programmi/news/

Sara' pure all'americana, ma a me pare una grossa 'stupidata' (per essere
buoni :))
bye bye


 la penultima cifra sia pari o dispari. Provare per credere!
Sì, è già stato detto più e più volte... ;-)
Però per quanto ne so io non c'entrano gli Americani né i Russi, è solo un
comportamento di tipo statistico.
Ciao,
Carlo.