2011-09-09 9 views
11

In C# C'è qualche differenza nell'accuratezza delle due strategie di arrotondamento decimale MidpointRounding.ToEven e MidpointRounding.AwayFromZero? Voglio dire, entrambi assicurano una distribuzione uniforme tra i numeri arrotondati, oppure una strategia di arrotondamento che rappresenta i numeri arrotondati rispetto all'altro?C# Rounding MidpointRounding.ToEven vs MidpointRounding.AwayFromZero

+1

La risposta accettata a questa domanda: http://stackoverflow.com/questions/311696/why-does-net-use-bankers-rounding-as-default dovrebbe chiarire le cose :) – MattDavey

+0

I pensa che l'esempio seguente lo spieghi meglio. :) –

+1

sì, lo fa :) - la domanda collegata ha un sacco di informazioni di base .. – MattDavey

risposta

27

Da MSDN:

Per impostazione predefinita, Math.round usa MidpointRounding.ToEven. La maggior parte delle persone non ha familiarità con "arrotondare per pareggiare" in quanto l'alternativa, "arrotondare lo zero" è più comunemente insegnata a scuola. Il valore predefinito di .NET è "Arrotondare a anche" in quanto è statisticamente superiore perché non condivide la tendenza di "arrotondamento da zero" a arrotondare leggermente più spesso di quanto arrotonda (supponendo che i numeri arrotondati tendano a essere positivi).

A seconda del set di dati, l'arrotondamento aritmetico simmetrico può introdurre un maggiore errore, poiché arrotonda sempre i valori del punto medio verso l'alto. Per fare un semplice esempio, supponiamo di voler determinare la media di tre valori, 1.5, 2.5 e 3.5, ma che vogliamo prima arrotondarli al numero intero più vicino prima di calcolare la media. Si noti che la media reale di questi valori è 2.5. Usando l'arrotondamento aritmetico simmetico, questi valori cambiano in 2, 3 e 4 e la loro media è 3. Usando l'arrotondamento dei banchieri, questi valori cambiano in 2, 2 e 4 e la loro media è 2,67. Poiché il secondo metodo di arrotondamento è molto più vicino alla media reale dei tre valori, fornisce la minore perdita di dati.

http://msdn.microsoft.com/en-us/library/system.math.round.aspx