Ограничение от двух до трех знаков после запятой
Это я, чего я пытаюсь достичь:
Если 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
Ответы
Ответ 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;
}