Как в C # округлить число до двух десятичных знаков?

Я хочу сделать это с помощью функции Math.Round


person Community    schedule 02.11.2008    source источник


Ответы (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);

Дополнительную информацию об этом можно найти здесь.

person Eoin Campbell    schedule 02.11.2008
comment
Вы должны уточнить, что по умолчанию используется MidPointRounding.ToEven. Если вы хотите AwayFromZero, вам придется использовать перегрузку - person Brian Vander Plaats; 23.02.2009
comment
Если вы хотите округлить до 2 десятичных знаков, добавьте 0.005 к числу перед округлением. Аналогично, чтобы округлить вниз, вычтите 0.005 перед переходом к Math.Round функции. - person orad; 20.08.2015
comment
Причина, по которой .NET по умолчанию использует MidPointRounding.ToEven (также известное как Bankers Rounding), заключается в том, что все мы научились округлять в школе, где округление 0,5 приводит к слишком большому округлению. Это проблема при работе с деньгами, налоговыми расчетами и т. Д. - person asporter; 11.11.2016

Попробуй это:

twoDec = Math.Round(val, 2)
person John Boker    schedule 02.11.2008

Если вам нужна строка

> (1.7289).ToString("#.##")
"1.73"

Или десятичный

> Math.Round((Decimal)x, 2)
1.73m

Но помни! Округление не является распределительным, т.е. round(x*y) != round(x) * round(y). Так что не округляйте до самого конца расчета, иначе вы потеряете точность.

person Colonel Panic    schedule 27.03.2013

Лично я никогда ничего не округляю. Сохраняйте его как можно более решительным, поскольку округление в CS в любом случае - отвлекающий маневр. Но вы действительно хотите форматировать данные для своих пользователей, и я считаю, что string.Format("{0:0.00}", number) это хороший подход.

person Gleno    schedule 23.02.2012
comment
Это лучше подходит для демонстрации, особенно для денег, поскольку 5,4 фунта стерлингов (с Math.round) выглядят не так хорошо, как 5,40 фунта стерлингов (в этом случае). - person Peter Gordon; 08.09.2015
comment
Я пробовал раньше string.Format (0: 0.00, number), но это не сработало. Эти квадратные скобки очень важны, поэтому работает: string.Format ({0: 0.00}, number). - person FrenkyB; 19.10.2015
comment
@FrenkyB Когда вы говорите «квадратные скобки», я надеюсь, вы имеете в виду фигурные скобки. - person Mathemats; 23.12.2015
comment
Это также раунды. 1,009 = ›1,01 - person Donny V.; 05.03.2020

// конвертируем до двух десятичных знаков

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"
person Rae Lee    schedule 15.01.2016
comment
String.Format ({0: 0.00}, 140.6767554); ! = 140.67 На самом деле он отображается как 140.68 - округление в большую сторону - person AndyT; 07.04.2017

В Википедии есть хорошая страница, посвященная округлению в целом.

Все (управляемые) языки .NET могут использовать любой из механизмов округления общеязыковой среды выполнения (CLR). Например, Math.Round () ( как упоминалось выше) позволяет разработчику указать тип округления (Округление до четного или От нуля). Метод Convert.ToInt32 () и его варианты используют округление до четности < / а>. Ceiling () и Методы Floor () связаны.

Вы также можете округлить с помощью настраиваемого числового форматирования.

Обратите внимание, что Decimal.Round () использует другой метод, чем Math.Round ();

Вот полезная позиция о банкире алгоритм округления. См. Одно из юмористических сообщений здесь о округлении… .

person Foredecker    schedule 02.11.2008

Это для округления до двух знаков после запятой в C #:

label8.Text = valor_cuota .ToString("N2") ;

В VB.NET:

 Imports System.Math
 round(label8.text,2)
person sadim    schedule 22.02.2012

Если вы хотите округлить число, вы можете получить разные результаты в зависимости от того, как вы используете функцию 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);
    }
}

Переменная «корректор» предназначена для исправления неточности работы с плавающими или двойными числами.

person fedesanp    schedule 09.05.2019

Я знаю, что это старый вопрос, но обратите внимание на следующие различия между Раундом математических вычислений и Раундом строкового формата:

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"
person Guy P    schedule 02.11.2017

Одна вещь, которую вы можете захотеть проверить, - это механизм округления Math.Round:

http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx

Помимо этого, я рекомендую подход Math.Round (inputNumer, numberOfPlaces) вместо подхода * 100/100, потому что он чище.

person Michael Stum    schedule 02.11.2008

У вас должна быть возможность указать количество цифр, которое вы хотите округлить, с помощью Math.Round (YourNumber, 2)

Дополнительную информацию можно найти здесь.

person Kevin W Lee    schedule 02.11.2008

Была странная ситуация, когда у меня была десятичная переменная, при сериализации 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
person Riyaz Hameed    schedule 11.09.2019

Math.Floor (123456,646 * 100) / 100 вернет 123456,64

person user3405179    schedule 30.09.2017

строка a = "10.65678";

десятичный d = Math.Round (Convert.ToDouble (a.ToString ()), 2)

person Abhishek Jaiswal    schedule 27.11.2015