Получить последние 2 десятичных знака без округления - PullRequest
8 голосов
/ 29 марта 2012

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

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

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

Есть идеи?

Ответы [ 5 ]

23 голосов
/ 29 марта 2012

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

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

Переместите десятичное число на две позиции вправо, приведите к int для усечения, сдвиньте его обратно влево на два места.Там могут быть способы сделать это тоже, но я не могу смотреть прямо сейчас.Вы можете обобщить это:

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;
}
14 голосов
/ 30 марта 2012

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

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

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

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

6 голосов
/ 29 марта 2012
 double d = Math.Truncate(d * 100) / 100;
2 голосов
/ 04 января 2014
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
2 голосов
/ 29 марта 2012

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

    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.

...