Как закръглявате число до два знака след десетичната запетая в 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 (известен още като закръгляване на банкери) е, че всички сме се научили да закръгляваме в училище, където .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, число), но не се получи. Тези квадратни скоби са много важни, така че: string.Format({0:0.00}, число) работи. - 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() и неговите варианти използват round-to-even. Ceiling() и Floor() методите са свързани.

Можете да закръглите и с персонализирано числово форматиране.

Имайте предвид, че Decimal.Round() използва метод, различен от Math.Round();

Ето една полезна позицияза банкера алгоритъм за закръгляване. Вижте една от хумористичните публикации на Реймънд тук относно закръгляването. .

person Foredecker    schedule 02.11.2008

Това е за закръгляване до 2 знака след десетичната запетая в 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#

Нека да видим какво се случва, ако искате да закръглите до 3-тия знак след десетичната запетая:

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);
    }
}

Променливата 'corrector' е за коригиране на неточността при работа с плаващи или двойни числа.

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 по някаква причина и те определено очакваха десетична. Тогава трябваше да напиша помощника по-долу, който винаги преобразува всяка десетична стойност, подплатена до 2 цифри с нули, вместо да изпраща низ.

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