2012-03-15 3 views
1

Можно создать дубликат:
c# - How do I round a decimal value to 2 decimal places (for output on a page)C# десятичного число раунд после запятой остального

как вернуть десятичный с длительным отдыхом после точки, как, что:

3.786444499963 

к этому :

3.787 

его не только сократить пункты также вокруг остальной части числа

+4

Вы знаете, что это неправильный способ обхода, верно? Правильный способ - просто взглянуть на четвертую десятичную цифру (в данном случае) – xanatos

+0

Вы пробовали мой ответ? –

+0

@xanatos, если вы делаете округление банкира, вам нужно посмотреть четвертую цифру, и если это 5, посмотрите, есть ли ненулевые цифры после четвертого. – phoog

ответ

4

Но общепринятое округление 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? Вы точно не указали, что хотите, поэтому я оставлю этот случай с краем.

+0

Какую ссылку мне нужно получить Assert? –

+0

Игнорировать 'Assert'. Это просто показывает вам, что оно порождает желаемое поведение. Вы можете видеть то же самое с 'Console.WriteLine'. – jason

+0

Да, спасибо. Простой контроль. – jason

0
RoundUp(3.786444499963M, 3); 

    static decimal RoundUp(decimal dec, int precision) 
    { 
     decimal rounder = (decimal)(0.5 * Math.Pow(10, -precision)); 
     return Math.Round(dec + rounder, precision); 
    } 
+2

Он вернется 3.786. Math.Round не «каскадируется» с последней цифры вперед.Он просто смотрит на позицию цифры + 1 – xanatos

+0

Мне нужно, чтобы она была округлена –

+0

@ roy.d: Есть три основных способа округления. Например округление до десятичных знаков: с округлением аппроксимация берется до ближайшего целого числа (0.3 -> 0; 0.7 -> 1); с Ceil аппроксимация всегда является ближайшим более высоким целым числом (0,3 -> 1; 0,7 -> 1), а с полом аппроксимация всегда является ближайшим нижним целым числом (0,3 -> 0; 0,7 -> 0). Какой из них вам нужен? –

5
Math.Ceiling(3.786444499963 * 1000)/1000; 
+0

спасибо, что оба ответа работают: Math.Ceiling (3.786444499963 * 1000)/1000; и Math.Round (3.786444499963m + 0.0005m, 3); –

Смежные вопросы