giovedì 13 dicembre 2007

Una funzione di arrotondamento per C# e VB.NET

Ho riscritto una vecchia funzione di arrotondamento che avevo relizzato con vb6.

Per la realizzazione ho sfruttato la classe Math del Framework .NET nei suoi metodi:
Math.Round - Arrotondamento matematico
Math.Ceiling - Arrotondamento per eccesso
Math.Floor - Arrotondamento per difetto

L'arrotondamento presentato nella funzione è alquanto diverso  da quello del framework, infatti sono possibili anche arrotondamenti come quello presentato nella form, impossibile da realizzare con la sola classe Math.

Il campo arrotondamento presentato è la "vera" differenza, sul campo (e sul parametro della funzione) va inserito il valore del "seme" dell'arrotondamento da ottenere es: 1 per arrotondamento all'unità 0,1 per l'arrotondamento con 1 decimale, 0,01 con due decimali (questi tre casi sono risolvibili anche con la sola classe Math), invece sono possibili anche arrotondamenti allo 0,15 o 9,998.

Storicamente, la funzione è nata per risolvere il problema del calcolo della quantità (peso) di materia prima da introdurre nelle confezioni, infatti con 1 grammo si facevano più di 10 confezioni, piccole differenze di materia prima moltiplicate per molte volte facevano saltare fuori grandi differenze con conseguenti problemi per gli approvvigionamenti che dovevano essere il più "giusti" possibile.

 

Esempio C#
Esempio VB.NET

4 commenti:

Unknown ha detto...

Salve,
sono arrivato a provare la sua funzione perchè ho una difficolta con il Math.Round.
Devo arrotondare il valore 0,705 a 2 decimali, usando l'arrotondamento matematico (mi serve per scrivere un importo). Dovrebbe essere banale, dovrebbe venire fuori 0,71. Invece viene 0,70 (o meglio 0,7).
Scioccato da questa notizia, ho fatto un po di ricerca su internet e ho provato la sua funzione e idem come sopra.
Che cosa sto sbagliando ?

Cordialmente

Andrea

Anonimo ha detto...

Perche non:)

Unknown ha detto...

Per l'arrotondamento da 0,705 a 0,71 la funzione corretta dovrebbe essere :
Math.Round(0.705, 2,MidpointRounding.AwayFromZero)

Ciao

Chico_

Luciano Bastianello ha detto...

Ringrazio Francesco ma il post che hai guardato è molto datato, credo sia il framework 2 da allora sono cambiate molte cose.