2013-03-14 35 views
17

vale quanto segue:Decimal.Round per MidpointRounding

var rounded = Decimal.Round(7.635m, 2); 
//rounded: 7.63 

Questo, per me, è un comportamento sbagliato e inaspettato. Assumerei il valore di arrotondato per essere 7,64.

Per raggiungere questo obiettivo, posso fare:

var rounded = Decimal.Round(7.635m, 2, MidpointRounding.AwayFromZero); 
//rounded: 7.64 

Come può questo non essere il comportamento predefinito di Decimal.Round? Qualche buona ragione per questo?

+0

Date un'occhiata a http://stackoverflow.com/a/977807/525138, non credo che si può cambiare il valore di default. – Dutts

+3

Suppongo che abbiano scelto questo come predefinito perché la maggior parte degli arrotondamenti sui decimali viene effettuata in valuta. Sfortunatamente, è anche l'impostazione predefinita per double.Round(), che in realtà occupa moltissimo molti calcoli matematici, in particolare quelli che calcolano le coordinate dei pixel. –

+0

Qualcuno nota che il round-to-even ** predefinito è arrotondato a dispari nel tuo esempio **? !! Ho trovato questo comportamento (errato?) Su una macchina ma non su un'altra. Anody sa cosa sta succedendo? – Timo

risposta

14

Come può questo non essere il comportamento predefinito di Decimal.Round? Qualche buona ragione per questo?

Se si guarda la documentazione di Decimal.Round Method (Decimal)

La comportamento di questo metodo segue standard IEEE 754, comma 4. Questo tipo di arrotondamento viene talvolta chiamato metà round a o arrotondamento del banco. Riduce al minimo gli errori di arrotondamento risultanti da arrotondando costantemente un valore del punto centrale in un'unica direzione. È equivalente a chiamare il metodo Round (Decimal, MidpointRounding) con un argomento della modalità di MidpointRounding.ToEven.

+0

Grazie, questo ha senso! :) –

+0

@ErikKinding, siete i benvenuti – Habib

+0

Ciò conferma il valore predefinito, ma non sommato al primo esempio di OP. Perché è ** arrotondando a strano **? Sto incontrando questo comportamento da solo, in modo irregolare, e non riesco a spiegarlo. – Timo

3

Da Math.Round(Decimal, Int32) Metodo

Il comportamento di questo metodo segue standard IEEE 754, sezione 4. Questo tipo di arrotondamento è talvolta chiamato arrotondamento al più vicino o arrotondamento. Riduce al minimo gli errori di arrotondamento risultanti dal costante arrotondamento di un valore del punto centrale in un'unica direzione.

Questo metodo equivale a chiamare il metodo Round con un argomento di modalità di MidpointRounding.ToEven. Se c'è una singola cifra non uguale a in d alla destra della posizione decimale dei decimali e il suo valore è 5, la cifra nella posizione dei decimali viene arrotondata se è dispari, o lasciata invariata se è pari. Se d ha un numero inferiore di cifre frazionarie rispetto ai decimali , d viene restituito invariato.

Problemi correlati