Як округлити число до двох знаків після коми у C #?


Відповіді:


629

Ось кілька прикладів:

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

Там більше інформації про нього тут .


51
Ви повинні уточнити, що MidPointRounding.ToEven є типовим. Якщо ви хочете AwayFromZero, вам доведеться скористатися перевантаженням
Brian Vander Plaats

5
Якщо ви хотіли округлити до двох знаків після коми, додайте 0.005їх до числа перед округленням. Так само, щоб округлити , відняти, 0.005перш ніж перейти до Math.Roundфункції.
орад

4
Причина, через яку .NET за замовчуванням MidPointRounding.ToEven (aka "Bankers Rounding") полягає в тому, що всі ми навчилися кругообігу в школі, де .5 раундів вгору викликає занадто багато округлення. Це проблема при роботі з грошима, податковими розрахунками тощо
аспортер


33

Особисто я ніколи нічого не округляю. Тримайте це якомога рішучіше, оскільки округлення так чи інакше є червоною оселедцем у CS. Але ви хочете форматувати дані для своїх користувачів, і для цього я вважаю, що string.Format("{0:0.00}", number)це хороший підхід.


Це краще працює для відображення, особливо для грошей, оскільки 5,4 фунта (з Math.round) виглядає не так добре, як 5,40 фунтів (таким чином).
Пітер Гордон

Я намагався перед string.Format ("0: 0,00", число), але це не вийшло. Ці квадратні дужки дуже важливі, тому: string.Format ("{0: 0.00}", число) працює.
FrenkyB

8
@FrenkyB Коли ви говорите "квадратні дужки", я сподіваюся, ви маєте на увазі дужки.
Математики

Цей тур також. 1.009 => 1.01
Донні В.

30

Якщо ви хочете рядок

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

Або десятковий

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

Але пам’ятайте! Округлення не є розподільним, тобто. round(x*y) != round(x) * round(y). Тому не робіть жодного округлення до самого кінця розрахунку, інакше ви втратите точність.


14

У Вікіпедії є приємна сторінка щодо округлення взагалі.

Усі .NET (керовані) мови можуть використовувати будь-які механізми округлення загальної мови (CLR). Наприклад, метод Math.Round () (як згадувалося вище) дозволяє розробнику вказувати тип округлення (Раунд-рівний або Вдалиний-від нуля). Метод Convert.ToInt32 () та його варіації використовують кругле до рівного . Методи Ceiling () та Floor () пов'язані між собою.

Ви також можете закріпити за допомогою спеціального цифрового форматування .

Зауважте, що Decimal.Round () використовує інший метод, ніж Math.Round ();

Ось корисна позиція щодо алгоритму округлення банкіра. Дивіться одну з жартівливих публікацій Реймонда тут про округлення ...


13

// конвертувати до двох знаків після коми

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"

1
String.Format ("{0: 0.00}", 140.6767554); ! = "140.67" Це насправді відображається як "140.68" - округлення
AndyT

7

Я знаю, що це давнє запитання, але, будь ласка, зверніть увагу на такі відмінності між Math Round і String формату раунду :

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"

6

Це для округлення до двох знаків після коми у C #:

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

У VB.NET:

 Imports System.Math
 round(label8.text,2)

5

Якщо ви хочете округлити число, ви можете отримати різні результати залежно від: як ви використовуєте функцію 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

Як бачите, перший раунд () є правильним, якщо ви хочете округлити середину. Але другий тур () неправильний, якщо ви хочете округлити його.

Це стосується негативних чисел:

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

Змінна 'коректор' призначена для виправлення неточності роботи з плаваючими чи подвійними числами.



3

Ви повинні мати можливість вказати кількість цифр, які ви хочете округлити, використовуючи Math.Round (YourNumber, 2)

Більше ви можете прочитати тут .




1

Якщо у нас була дивна ситуація, коли у мене була десяткова змінна, при серіалізації 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

0
  public double RoundDown(double number, int decimalPlaces)
        {
            return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.