Я хочу сделать это с помощью функции Math.Round
Как в C # округлить число до двух десятичных знаков?
Ответы (14)
Вот несколько примеров:
decimal a = 1.994444M;
Math.Round(a, 2); //returns 1.99
decimal b = 1.995555M;
Math.Round(b, 2); //returns 2.00
Вы также можете посмотреть, как банкиры округляют / округляют до безубыточности со следующей перегрузкой:
Math.Round(a, 2, MidpointRounding.ToEven);
Дополнительную информацию об этом можно найти здесь.
0.005
к числу перед округлением. Аналогично, чтобы округлить вниз, вычтите 0.005
перед переходом к Math.Round
функции.
- person orad; 20.08.2015
MidPointRounding.ToEven
(также известное как Bankers Rounding), заключается в том, что все мы научились округлять в школе, где округление 0,5 приводит к слишком большому округлению. Это проблема при работе с деньгами, налоговыми расчетами и т. Д.
- person asporter; 11.11.2016
Попробуй это:
twoDec = Math.Round(val, 2)
Если вам нужна строка
> (1.7289).ToString("#.##")
"1.73"
Или десятичный
> Math.Round((Decimal)x, 2)
1.73m
Но помни! Округление не является распределительным, т.е. round(x*y) != round(x) * round(y)
. Так что не округляйте до самого конца расчета, иначе вы потеряете точность.
Лично я никогда ничего не округляю. Сохраняйте его как можно более решительным, поскольку округление в CS в любом случае - отвлекающий маневр. Но вы действительно хотите форматировать данные для своих пользователей, и я считаю, что string.Format("{0:0.00}", number)
это хороший подход.
// конвертируем до двух десятичных знаков
String.Format("{0:0.00}", 140.6767554); // "140.67"
String.Format("{0:0.00}", 140.1); // "140.10"
String.Format("{0:0.00}", 140); // "140.00"
Double d = 140.6767554;
Double dc = Math.Round((Double)d, 2); // 140.67
decimal d = 140.6767554M;
decimal dc = Math.Round(d, 2); // 140.67
=========
// just two decimal places
String.Format("{0:0.##}", 123.4567); // "123.46"
String.Format("{0:0.##}", 123.4); // "123.4"
String.Format("{0:0.##}", 123.0); // "123"
также можно комбинировать «0» с «#».
String.Format("{0:0.0#}", 123.4567) // "123.46"
String.Format("{0:0.0#}", 123.4) // "123.4"
String.Format("{0:0.0#}", 123.0) // "123.0"
В Википедии есть хорошая страница, посвященная округлению в целом.
Все (управляемые) языки .NET могут использовать любой из механизмов округления общеязыковой среды выполнения (CLR). Например, Math.Round () ( как упоминалось выше) позволяет разработчику указать тип округления (Округление до четного или От нуля). Метод Convert.ToInt32 () и его варианты используют округление до четности < / а>. Ceiling () и Методы Floor () связаны.
Вы также можете округлить с помощью настраиваемого числового форматирования.
Обратите внимание, что Decimal.Round () использует другой метод, чем Math.Round ();
Вот полезная позиция о банкире алгоритм округления. См. Одно из юмористических сообщений здесь о округлении… .
Это для округления до двух знаков после запятой в C #:
label8.Text = valor_cuota .ToString("N2") ;
В VB.NET:
Imports System.Math
round(label8.text,2)
Если вы хотите округлить число, вы можете получить разные результаты в зависимости от того, как вы используете функцию Math.Round () (если для округления вверх или вниз), вы работаете с числами с двойными и / или плавающими числами. , и вы примените округление средней точки. Особенно, когда используется с операциями внутри него или переменная для округления происходит от операции. Допустим, вы хотите умножить эти два числа: 0,75 * 0,95 = 0,7125. Верно? Не в C #
Посмотрим, что произойдет, если вы захотите округлить до третьего знака после запятой:
double result = 0.75d * 0.95d; // result = 0.71249999999999991
double result = 0.75f * 0.95f; // result = 0.71249997615814209
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = 0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = 0.712. Should be 0.713
Как видите, первый Round () правильный, если вы хотите округлить среднюю точку в меньшую сторону. Но второй Round () неправильно, если вы хотите округлить.
Это относится к отрицательным числам:
double result = -0.75 * 0.95; //result = -0.71249999999999991
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = -0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = -0.712. Should be -0.713
Итак, IMHO, вы должны создать свою собственную функцию переноса для Math.Round (), которая соответствует вашим требованиям. Я создал функцию, в которой параметр roundUp = true означает округление до следующего большего числа. То есть: 0,7125 округляется до 0,713 и -0,7125 округляется до -0,712 (потому что -0,712> -0,713). Это функция, которую я создал, и она работает с любым количеством десятичных знаков:
double Redondea(double value, int precision, bool roundUp = true)
{
if ((decimal)value == 0.0m)
return 0.0;
double corrector = 1 / Math.Pow(10, precision + 2);
if ((decimal)value < 0.0m)
{
if (roundUp)
return Math.Round(value, precision, MidpointRounding.ToEven);
else
return Math.Round(value - corrector, precision, MidpointRounding.AwayFromZero);
}
else
{
if (roundUp)
return Math.Round(value + corrector, precision, MidpointRounding.AwayFromZero);
else
return Math.Round(value, precision, MidpointRounding.ToEven);
}
}
Переменная «корректор» предназначена для исправления неточности работы с плавающими или двойными числами.
Я знаю, что это старый вопрос, но обратите внимание на следующие различия между Раундом математических вычислений и Раундом строкового формата:
decimal d1 = (decimal)1.125;
Math.Round(d1, 2).Dump(); // returns 1.12
d1.ToString("#.##").Dump(); // returns "1.13"
decimal d2 = (decimal)1.1251;
Math.Round(d2, 2).Dump(); // returns 1.13
d2.ToString("#.##").Dump(); // returns "1.13"
Одна вещь, которую вы можете захотеть проверить, - это механизм округления Math.Round:
http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
Помимо этого, я рекомендую подход Math.Round (inputNumer, numberOfPlaces) вместо подхода * 100/100, потому что он чище.
У вас должна быть возможность указать количество цифр, которое вы хотите округлить, с помощью Math.Round (YourNumber, 2)
Дополнительную информацию можно найти здесь.
Была странная ситуация, когда у меня была десятичная переменная, при сериализации 55,50 она всегда математически устанавливает значение по умолчанию как 55,5. Но в то время как наша клиентская система по какой-то причине всерьез ожидает 55,50, и они определенно ожидали десятичного числа. Тогда я написал нижеприведенный помощник, который всегда преобразует любое десятичное значение, дополненное двумя цифрами с нулями, вместо отправки строки.
public static class DecimalExtensions
{
public static decimal WithTwoDecimalPoints(this decimal val)
{
return decimal.Parse(val.ToString("0.00"));
}
}
Использование должно быть
var sampleDecimalValueV1 = 2.5m;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());
decimal sampleDecimalValueV1 = 2;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());
Выход:
2.50
2.00
Math.Floor (123456,646 * 100) / 100 вернет 123456,64
строка a = "10.65678";
десятичный d = Math.Round (Convert.ToDouble (a.ToString ()), 2)