2012-03-29 3 views
7

В C#, я пытаюсь получить последние два десятичных знака двойного с NO округлением. Я пробовал все: от Math.Floor до Math.Truncate и ничего не работает.Получить последние 2 десятичных места без округления

Образцы результатов, которые я хотел бы:

1,424.2488298 -> 1,424.24 
53.5821 -> 53.58 
10,209.2991 -> 10,209.29 

Есть идеи?

+1

Если вы работа в * десятичном формате *, то почему вы используете * double *, когда можете использовать * десятичный *? –

+0

Вы можете перейти к этому сообщению и найти то, что вам подходит http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

ответ

22

Ну, математически это просто:

var f = 1.1234; 
f = Math.Truncate(f * 100)/100; // f == 1.12 

Move десятичные два места справа, отлитые на междунар укоротить, переместить его обратно в левых двух местах. В этом могут быть и способы, но я не могу сейчас смотреть. Можно обобщить:

double Truncate(double value, int places) 
{ 
    // not sure if you care to handle negative numbers...  
    var f = Math.Pow(10, places); 
    return Math.Truncate(value * f)/f; 
} 
+0

Не так просто. Партии имеют больший диапазон, чем ints. – Joe

+0

@joe: Хорошая точка, используйте Math.Truncate вместо этого, не требуется никакого заливки –

+0

@EdS. Я пробовал это по значению 136.2025, используя ваш первый метод, и он обрезал его до 136.2 и сбросил 0. Есть ли способ сохранить в нем 0? – mint

2

Общее решение:

public static double SignificantTruncate(double num, int significantDigits) 
    { 
     double y = Math.Pow(10, significantDigits); 
     return Math.Truncate(num * y)/y; 
    } 

Тогда

double x = 5.3456; 
    x = SignificantTruncate(x,2); 

даст желаемый результат x=5.34.

14

Мой совет: Остановить использование double во-первых. Если вам нужно десятичное округление, то шансы хорошие, вы должны использовать decimal. Какова ваша заявка?

Если у вас есть двойной, вы можете сделать это следующим образом:

double r = whatever; 
decimal d = (decimal)r; 
decimal truncated = decimal.Truncate(d * 100m)/100m; 

Обратите внимание, что этот метод не сработает, если абсолютное значение вдвое больше, чем 792281625142643375935439504, так как умножение на 100 не получится , Если вам нужно обрабатывать большие значения, вам нужно будет использовать специальные методы. (Конечно, к тому времени дважды в том, что большой, вы далеко за пределами своей способности представлять значения с двумя цифрами после десятичной точки в любом случае.)

2
Math.Round(NumberToRound - (double)0.005,2) 

т.е.

Math.Round(53.5821 - (double)0.005,2) // 53.58 
Math.Round(53.5899 - (double)0.005,2) // 53.58 
Math.Round(53.5800 - (double)0.005,2) // 53.58 
Смежные вопросы