2014-11-10 2 views
-1

У меня есть десятичную переменную со следующими значениямиДесятичная цифра усечения C#

a = 99.9999 
b = 88.423766 
c = 11.896589 

Здесь я пытаюсь преобразовать с 4 знаков после запятой.

И я использовал

a = Math.Round(Convert.ToDecimal(a), 4); 
b = Math.Round(Convert.ToDecimal(b), 4); 
c = Math.Round(Convert.ToDecimal(c), 4); 

Однако я получаю значения, как

a = 100 
b = 88.4238 
c = 11.8966 

Хотя предпочтительные значения с округлением из,

a = 99.9999 
b = 88.4237 
c = 11.8965 

Как я могу достичь.

+1

http://stackoverflow.com/questions/6872165/rounding-to-at-least-2-to-4-decimal-places – marsh

+1

@marsh Этот вопрос требует округления, этот хочет усечения. – juharr

+2

Нет перегрузки для 'Convert.ToDecimal', у которого есть два параметра, второй -' int' - вы, вероятно, имели в виду 'Convert.ToDecimal (Math.Round (...))' Не могли бы вы исправить свой вопрос так что код на самом деле то, что вы используете? –

ответ

3

Там нет встроенной функции для усечения с decimal до N знаков после запятой, но это очень просто:

a = Math.Truncate(a * 10000m)/10000m; 

или в качестве вспомогательной функции:

public decimal Truncate(decimal d, int n) 
{ 
    // calculate 10^n 
    decimal t = (decimal)Math.Pow(10.0,n); 

    return Math.Truncate(d * t)/t; 
} 

или как способ расширения:

public decimal Truncate(this decimal d, int n) 
{ 
    // calculate 10^n 
    decimal t = (decimal)Math.Pow(10.0,n); 

    return Math.Truncate(d * t)/t; 
} 

Обратите внимание, что разница между Math.Truncate и Math.Floor является обработка отрицательных чисел. Math.Truncate буквально усечение десятичных цифр, в то время как Math.Floor возвращает наибольшее целое число меньше, чем на вход, так Math.Truncate(-1.2) вернется -1 пока Math.Floor(-1.2) вернется -2.

+0

Спасибо, что очень хорошее объяснение. – TBA

1

Это будет держать 4 знаков после запятой и усечение остального:

a = decimal.Truncate(a*10000)/10000; 
b = decimal.Truncate(b*10000)/10000; 
c = decimal.Truncate(c*10000)/10000; 
+0

Это не так. Попробуйте с помощью '-88.423766m', результатом будет' -88.4238' (не усеченный). –

+0

Упс, пропустил нуль при расчете. Отрицательные значения являются проблемой, хотя ... – Richnau

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