Ограничение от 2 до 3 знаков после запятой - PullRequest
44 голосов
/ 28 сентября 2010

Это то, чего я пытаюсь достичь:

Если в дубле больше 3 знаков после запятой, я хочу обрезать все знаки после третьего. (не округляйте.)

Eg.: 12.878999 -> 12.878

Если двойное число содержит менее 3 десятичных знаков, оставить без изменений

Eg.:   125   -> 125
       89.24 -> 89.24

Я наткнулся на эту команду:

double example = 12.34567;
double output = Math.Round(example, 3);

Но я не хочу округлять. Согласно команде, размещенной выше, 12.34567 -> 12.346

Я хочу усечь значение, чтобы оно стало: 12.345

Ответы [ 8 ]

62 голосов
/ 28 сентября 2010

Двойные числа не имеют десятичных разрядов - для начала они не основаны на десятичных цифрах.Вы можете получить «ближайший двойник к текущему значению при усечении до трех десятичных цифр», но он все равно не будет таким же.Вам было бы лучше использовать decimal.

Сказав, что, если проблема заключается только в способе округления, вы можете использовать Math.Truncate(value * 1000) / 1000;, который может делать то, что выхочу.(Вы не хотите, чтобы округлял вообще, по звукам этого.) Это все еще потенциально "хитроумно", хотя, в результате все равно на самом деле не будет просто три десятичных знака.Однако, если вы сделали то же самое с десятичным значением, оно будет работать :

decimal m = 12.878999m;
m = Math.Truncate(m * 1000m) / 1000m;
Console.WriteLine(m); // 12.878

РЕДАКТИРОВАТЬ: Как указал Л.Бушкин, вы должны быть свободны между усечениями для отображения целей (что обычно можно сделать в спецификаторе формата) и усечение для дальнейших вычислений (в этом случае вышеприведенное должно работать).

39 голосов
/ 28 сентября 2010

Я не могу придумать причину явно потерять точность за пределами целей отображенияВ этом случае просто используйте форматирование строки.

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));
18 голосов
/ 06 февраля 2014
double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));
7 голосов
/ 28 сентября 2010

Умножьте на 1000, затем используйте Усечение , затем разделите на 1000.

5 голосов
/ 28 сентября 2010

Если ваша цель в усечении цифр заключается в целях отображения, тогда вы просто используете соответствующее форматирование при преобразовании двойного в строку.

Методы, такие как String.Format() и Console.WriteLine() (и другие) позволяет ограничить количество цифр точности, с которой форматируется значение.

Попытка «усечь» числа с плавающей запятой не рекомендуется - числа с плавающей запятой не имеют точногодесятичное представление во многих случаях.Применение такого подхода, как масштабирование числа, его усечение, а затем его уменьшение, может легко изменить значение на нечто совершенно отличное от того, что вы ожидали для «усеченного» значения.

Если вынужны точные десятичные представления числа, которое вы должны использовать decimal вместо double или float.

3 голосов
/ 28 сентября 2010

Вы можете использовать:

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;
1 голос
/ 06 марта 2014

In C lang:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}
1 голос
/ 28 сентября 2010

Хорошие ответы выше - если вы ищете что-то повторно используемое, вот код.Обратите внимание, что вы можете проверить значение десятичных разрядов, и это может привести к переполнению.

public static decimal TruncateToDecimalPlace(this decimal numberToTruncate, int decimalPlaces)
{
    decimal power = (decimal)(Math.Pow(10.0, (double)decimalPlaces));

    return Math.Truncate((power * numberToTruncate)) / power;
}
...