2013-12-16 2 views
6

Perché l'arrotondamento Math.Round (0,125, 2) a 0,12?VB.Net Perché Math.Round arrotonda il 5 al numero pari più vicino e cosa posso fare al riguardo?

Dim foo As Decimal 
foo = Math.Round(0.125, 2) 

foo è ora 0,12 ma dovrebbe b 0,13

Ho sentito che è perché alcuni standard .Net arrotonda al numero pari più vicino, ma questo è solo male matematica. 12.5 arriverà al 12, ma il 13.5 arriverà fino a 14. C'è un modo per risolvere questo problema?

+1

MidpointRounding Cordiali saluti, questo è noto come "banchiere di arrotondamento". –

+2

È l'arrotondamento del banchiere. Usa il sovraccarico Round() che accetta un argomento MidpointRounding per cambiarlo. –

+3

http://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default – Will

risposta

10

Dal documentation sul metodo Math.Round(decimal):

Se il componente frazionaria di d è a metà strada tra due numeri interi, uno dei quali è anche e l'altro dispari, viene restituito il numero pari.

La stessa logica si applica al sovraccarico Math.Round(decimal, int). Avviso:

Math.Round(0.125, 2) // 0.12 
Math.Round(0.135, 2) // 0.14 
Math.Round(0.145, 2) // 0.14 

Non è "cattiva matematica"; è una strategia di arrotondamento comune conosciuta come "round-to-even". Da Wikipedia:

Questa variante del round-a-nearest metodo è anche chiamato arrotondamento imparziale, convergente arrotondamento, statistico di arrotondamento, olandese arrotondamento, gaussiana arrotondamento, dispari arrotondamento pari, arrotondamento dei banchi o arrotondamento arrotondato ed è ampiamente utilizzato nella contabilità.

Questa è la modalità di arrotondamento predefinita utilizzata nelle funzioni e operatori di calcolo IEEE 754.

Se si desidera un controllo più preciso su come si arrotonda, è possibile specificare un parametro

Math.Round(0.125, 2, MidpointRounding.AwayFromZero) // 0.13 
+0

Ah, MidpointRounding.AwayFromZero fa il trucco. Imparo qualcosa di nuovo ogni giorno Grazie! – BClaydon