Arrotondamento numeri decimali alla seconda cifra

lunedì 10 dicembre 2012 - 18.52
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  SQL Server Express

alsa Profilo | Junior Member

Salve ragazzi,
vi chiedo ancora aiuto per una banalità che mi sta facendo perdere giornate intere di lavoro.
La questione è semplice, in un progetto VB.Net, data una variabile prezzo con questo valore: 3,3057854890 io voglio arrotondarlo a 3,30 e per fare questo ho utilizzato questa funzione:

prezzo = Math.Round(prezzo, 2, MidpointRounding.ToEven)

bene, il risultato diventa 3,31. Questo perchè, sicuramente la terza cifra decimale (5) viene arrotondata a 6 dato che la successiva cifra decimale è un 7.

Come faccio a troncare il numero alle prime 3 cifre decimali prima di effettuare l' arrotondamento?

ridaria Profilo | Expert

>Salve ragazzi,
>vi chiedo ancora aiuto per una banalità che mi sta facendo perdere
>giornate intere di lavoro.
>La questione è semplice, in un progetto VB.Net, data una variabile
>prezzo con questo valore: 3,3057854890 io voglio arrotondarlo
>a 3,30 e per fare questo ho utilizzato questa funzione:
>
>prezzo = Math.Round(prezzo, 2, MidpointRounding.ToEven)
>
>bene, il risultato diventa 3,31. Questo perchè, sicuramente la
>terza cifra decimale (5) viene arrotondata a 6 dato che la successiva
>cifra decimale è un 7.
>
>Come faccio a troncare il numero alle prime 3 cifre decimali
>prima di effettuare l' arrotondamento?



Non credo sia il 7 è il 5 che lui lo arrotonda per eccesso.


COMUNQUE

tagli la stringa e ti prendi solo i primi tre decimali dopo la virgola.



MA credo che non è la strada giusta, quel numero arrotondato a due decimali è ,31
questo è il numero.


Riccardo D'Aria

alsa Profilo | Junior Member

Ma il "MidpointRounding.ToEven" non serve proprio a specificare che nel caso la 3° cifra sia un 5 il numero deve essere arrotondato per difetto?

Vinsent Profilo | Senior Member

Se è 3,31...perchè non lo lasci così...i centesimi so soldi...:
http://www.youtube.com/watch?v=Vbm3c7GAGks

...a parte gli scherzi...
>Ma il "MidpointRounding.ToEven" non serve proprio a specificare
>che nel caso la 3° cifra sia un 5 il numero deve essere arrotondato
>per difetto?
è una funzione che non conoscevo ed ho cercato di approfondire...tiene conto dell' intero valore/stringa ed appena vede un decimale sopra lo zero fa + 1 sul decimale che lo precede, almeno da quel che ho capito....:
Dim a As Decimal = CDec("3,3057854890") Dim b As Decimal = CDec("3,3057") Dim c As Decimal = CDec("3,3051") Dim d As Decimal = CDec("3,3050") Dim e As Decimal = CDec("3,3041") Console.WriteLine(a & " = " & Math.Round(a, 2, MidpointRounding.ToEven)) Console.WriteLine(b & " = " & Math.Round(b, 2, MidpointRounding.ToEven)) Console.WriteLine(c & " = " & Math.Round(c, 2, MidpointRounding.ToEven)) Console.WriteLine(d & " = " & Math.Round(d, 2, MidpointRounding.ToEven)) Console.WriteLine(e & " = " & Math.Round(e, 2, MidpointRounding.ToEven))
puoi verificare notando il risultato del writeline di "c", "d" e "e".
Segui il consiglio di Ridaria o implementa una function per ottenere il risultato che ti serve...
Ciao!

ridaria Profilo | Expert

ok ho fatto una verifica ..... il metodo MidpointRounding.ToEven serve proprio a dirgli di arrotondare per difetto e quindi il 6 successivo ti causa gli incrementi successivi e quindi il "31".

Credo che non ti resta che tagliare la stringa al terzo decimale o al secondo e procedere.


CIAO
Riccardo D'Aria

alsa Profilo | Junior Member

Ok ragazzi,
vi ringrazio per l' aiuto ma penso proprio di aver risolto, in pratica la situazione era un pò più lunga della semplice conversione di quel numero.
Io avevo un totale da far uscire in fattura e poi, voce per voce, nella compilazione della fattura dovevo scorporare l' iva.
Il mio errore principale è stato quello di sommare l' iva e l' imponibile da far uscire in fattura man mano che scorporavo l' iva per ogni voce della fattura.
Questa somma però la facevo senza arrotondare i valori ottenuti, giustamente quindi, i valori che avevo a video risultavano diversi da quelli che venivano stampati in fattura.
In conclusione diciamo che mi ero un pò incartato da solo ma, non tutti i mali vengono per nuocere dato che grazie a questa cosa abbiamo scoperto il midpointrounding e nel frattempo ho anche creato una piccola funzione per troncare un numero alla 3° cifra decimale e arrotondarlo x difetto se la 3° cifra fosse un 5.

Spero di non essermi incartato anche in questa spiegazione e vi ringrazio!!!

ridaria Profilo | Expert

Potresti chiudere ancheil post a questo punto, cliccando su accetta del messaggio che ritieni ti sia stato di maggior supporto.



Caio
Riccardo D'Aria

Ansl72 Profilo | Newbie

@alsa

Ciao potresti dirmi come hai fatto in quanto ho il tuo stesso problema:

in pratica ho ad es. 454,55 + 10 % (iva) = 45,455

con il MidpointRounding.ToEven mi arrotonda 45,46 che non va bene in quanto ottengo

per cui 454,55 + 45,46 = 500,01

io vorrei ottenere 500,00

puoi aiutarmi magari utilizzando la funzione che hai fatto tu?

grazie

alsa Profilo | Junior Member

Allora Ansl
in realtà, dopo un primo momento in cui mi sembrava di aver risolto con la funzione di arrotondamento, mi sono reso conto che non era proprio così, anche se la funzione faceva ciò che volevo.
Alla fine ho risolto con un piccolo escamotage direttamente in fattura, per cui, ti chiedo, tu hai problemi nella compilazione delle fatture? O i tuoi conteggi servono ad altro?
Nel frattempo comunque ritrovo la funzione e posso postartela!

Ansl72 Profilo | Newbie

Ciao
si il mio problema è proprio la compilazione delle fatture e di preventivi.

ho letto qui

http://it.wikipedia.org/wiki/Arrotondamento

su wiki di tecniche di arrotondamento e stavo cercato di fare un funzione
seguendo quelle regole scritte in basso!

grazie.

alsa Profilo | Junior Member

In realtà io il problema non l' ho risolto ma l' ho bypassato, in quanto, in fattura, ho inserito una voce "Arrotondamento" che può essere anche negativa, e corrisponde alla differenza che ho tra l' imponibile visualizzato a video e l' imponibile visualizzato in fattura.
Ovviamente, prima di fare ciò sono stato consigliato da un commercialista che mi ha assicurato che fiscalmente è una cosa lecita .
Se hai bisogno comunque ti posto la mia funzione, appena la ritrovo!

Ansl72 Profilo | Newbie

ok
magari prendo spunto.
grazie!

alsa Profilo | Junior Member

Ti posto comunque la funzione che arrotonda la 3° cifra decimale per difetto qualora fosse uguale a 5

Public Sub arrotondamento(ByRef prezzo As Decimal) Dim prstr As String = CStr(prezzo) 'Variabile utilizzata per il conteggio dei numeri prima della virgola Dim previr As Integer = 0 Dim len As Integer = prstr.Length 'ciclo prstr per assegnare il valore a previr For i As Integer = 0 To len If prstr.Chars(i) <> "," Then previr += 1 Else Exit For End If Next 'Variabile che stabilisce a quale cifra arrotondare Dim taglio As Integer = previr + 4 Dim prezzotagliato As String = Nothing 'Se la lunghezza del prezzo è inferiore del valore della variabile Taglio 'Aggiungo tanti 0 alla fine, quante sono le cifre di differenza If len < taglio Then prstr.PadRight(taglio, CChar("0")) End If taglio -= 1 'Arrotondo la 3° cifra decimale per difetto qualora fosse uguale a 5 Dim ultstr As String = prstr.Chars(taglio) Dim ultimo As Integer = CInt(ultstr) If ultimo = 5 Then ultstr = "4" End If 'Ricompongo il prezzo For i As Integer = 0 To (taglio - 1) prezzotagliato &= prstr.Chars(i) Next prezzotagliato &= ultstr prezzo = CDec(prezzotagliato) prezzo = Math.Round(prezzo, 2) End Sub

Fammi sapere se risolvi.

Ansl72 Profilo | Newbie

ok grazie!

ti faccio sapere.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5