Но общепринятое округление 3.786444499963
до трех знаков после запятой является 3.786
. Почему вы думаете иначе?
Таким образом:
var round = Math.Round(3.786444499963m, 3, MidpointRounding.AwayFromZero);
Console.WriteLine(round == 3.786m); // prints true
Если вы хотите, чтобы всегда округлить:
var round = Math.Round(3.786444499963m + 0.0005m, 3);
Console.WriteLine(round == 3.787m); // prints true
Вы видите, что я там делал? Я добавил 0.0005m
на вход перед использованием Math.Round
. В общем, округлить x
до n
знаков после запятой,
var round = Math.Round(x + 5m * Convert.ToDecimal(Math.Pow(10, -n - 1)), n);
Или, может быть, чтобы избежать уродливой double/decimal
преобразования:
int k = 1;
decimal value = 5m;
while(k <= n + 1) { value /= 10m; k++; }
var round = Math.Round(x + value, n);
Там в крайнем случае вы должны быть в курсе. Что происходит с 3.786? Следует ли округлить до 3.787 или остаться на 3.786? Вы точно не указали, что хотите, поэтому я оставлю этот случай с краем.
Вы знаете, что это неправильный способ обхода, верно? Правильный способ - просто взглянуть на четвертую десятичную цифру (в данном случае) – xanatos
Вы пробовали мой ответ? –
@xanatos, если вы делаете округление банкира, вам нужно посмотреть четвертую цифру, и если это 5, посмотрите, есть ли ненулевые цифры после четвертого. – phoog