Подтвердить что ты не робот

Ограничение от двух до трех знаков после запятой

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

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

Eg.: 12.878999 -> 12.878

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

Eg.:   125   -> 125
       89.24 -> 89.24

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

double example = 12.34567;

Console.Out.WriteLine(example.ToString("#.000"));

Ответ 3

double example = 3.1416789645;
double output = Convert.ToDouble(example.ToString("N3"));

Ответ 4

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

Ответ 5

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

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

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

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

Ответ 6

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

double example = 12.34567;
double output = ( (double) ( (int) (example * 1000.0) ) ) / 1000.0 ;

Ответ 7

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

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

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

Ответ 8

В C lang:

double truncKeepDecimalPlaces(double value, int numDecimals)
{
    int x = pow(10, numDecimals);
    return (double)trunc(value * x) / x;
}