non riesco a riprodurre il problema:
Math.Round(1.275m, 2) => 1.28m
Math.Round(1.375m, 2) => 1.38m
ho il sospetto che il vostro reclamo che si utilizza un valore decimal
è falso, e che si utilizza double
valore invece. double
non può rappresentare esattamente molti valori decimali, quindi quando scrivi 1.275
, in realtà è 1.27499 ... 1.375
è una delle poche rappresentazioni, quindi è in realtà 1.375
.
Se il codice si preoccupa esatta rappresentazione decimale, ad esempio quando si lavora sul denaro, si must uso decimal
e non binaria in virgola mobile come double
o float
.
Ma anche se si utilizza rappresentazione decimale, arrotondamento comporta inaspettatamente per molti utenti:
Math.Round(1.265m, 2) => 1.26m
Math.Round(1.275m, 2) => 1.28m
Per impostazione predefinita Math.Round
usa MidpointRounding.ToEven
, noto anche come Banker's round. Ciò evita di accumulare una distorsione da arrotondare sempre a .5
.
È possibile utilizzare un sovraccarico di Round
che utilizza una modalità di arrotondamento e impostarlo su AwayFromZero
per ottenere il comportamento previsto.
Math.Round(1.275m, 2, MidpointRounding.AwayFromZero) => 1.28m
Mi dispiace, non ho trovato lo screenshot ;-) ma ho trovato questo blog: http://weblogs.asp.net/sfurman/archive/2003/03/07/3537.aspx –
Stai effettivamente usando un valore 'decimale', o stai usando' double'? – CodesInChaos
È un po 'di confusione quando dici di arrotondare il valore "decimale"; 'Math.Round (1.275m, 2) = 1.28', mentre se si utilizza il sovraccarico' double' si ottiene, come si scrive, 'Math.Round (1.275, 2) = 1.27'. Il problema è molto probabilmente a causa di inaccuratezza nella rappresentazione in virgola mobile. –