C#

Math.Round в C#: как округлить число до целого и до двух знаков

В C# для округления используют Math.Round. Если нужно округлить до целого, передайте одно число. Если нужно округлить до двух знаков после запятой, передайте вторым аргументом количество знаков

Пример:

double value = 12.345;

Console.WriteLine(Math.Round(value));
Console.WriteLine(Math.Round(value, 2));

Результат:

12
12,35

Формат запятой или точки зависит от региональных настроек системы

Округление до целого

double price = 1490.75;
double rounded = Math.Round(price);

Console.WriteLine(rounded);

Ожидаемый результат:

1491

Если дробная часть ближе к следующему числу, значение округляется вверх. Но с .5 есть важная особенность

Почему 2.5 может стать 2

По умолчанию Math.Round использует округление к ближайшему четному числу для середины. Это называют банковским округлением:

Console.WriteLine(Math.Round(2.5));
Console.WriteLine(Math.Round(3.5));

Результат:

2
4

Это не ошибка. Так сделано, чтобы при большом количестве операций округление не давало постоянный перекос вверх

Округление .5 всегда от нуля

Если вам нужно привычное школьное поведение, используйте MidpointRounding.AwayFromZero:

Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero));
Console.WriteLine(Math.Round(3.5, MidpointRounding.AwayFromZero));

Результат:

3
4

Для финансовых расчетов важно заранее выбрать правило и использовать его везде одинаково

Округление до двух знаков

double total = 123.4567;
double rounded = Math.Round(total, 2);

Console.WriteLine(rounded);

Результат:

123,46

Если нужно именно красиво вывести число, а не менять значение для дальнейших расчетов, можно форматировать вывод:

double total = 123.4;
Console.WriteLine(total.ToString("F2"));

Результат:

123,40

Math.Round и деньги

Для денег лучше использовать decimal, а не double:

decimal price = 199.995m;
decimal rounded = Math.Round(price, 2, MidpointRounding.AwayFromZero);

Console.WriteLine(rounded);

decimal точнее подходит для денежных значений, потому что double хранит числа в двоичном формате и иногда дает неожиданные дробные хвосты

Частые ошибки

Ждать, что Round всегда округляет .5 вверх

По умолчанию это не так. Для привычного поведения указывайте MidpointRounding.AwayFromZero

Путать округление и форматирование

Math.Round(value, 2) меняет числовое значение. ToString("F2") меняет только строковое отображение

Использовать double для денег без необходимости

Для цен, оплат и налогов чаще выбирайте decimal

Round, Floor, Ceiling и Truncate

Math.Round — не единственный способ убрать дробную часть. В C# есть несколько похожих методов, и они решают разные задачи:

double value = 12.7;

Console.WriteLine(Math.Round(value));    // 13
Console.WriteLine(Math.Floor(value));    // 12
Console.WriteLine(Math.Ceiling(value));  // 13
Console.WriteLine(Math.Truncate(value)); // 12

Коротко:

  • Round округляет к ближайшему числу;
  • Floor всегда вниз;
  • Ceiling всегда вверх;
  • Truncate просто отбрасывает дробную часть.

Для скидок и цен чаще нужен Round. Для количества страниц при пагинации может пригодиться Ceiling: если товаров 21, а на странице 10, нужно 3 страницы

Практический сценарий: средний чек

Допустим, у вас есть сумма заказов и количество заказов:

decimal totalRevenue = 15340m;
int ordersCount = 7;

decimal average = totalRevenue / ordersCount;
decimal roundedAverage = Math.Round(average, 2, MidpointRounding.AwayFromZero);

Console.WriteLine(roundedAverage);

Так можно показать средний чек в отчете без длинного дробного хвоста

Мини-задание

Посчитайте итог заказа с налогом и округлите до двух знаков:

decimal price = 999.99m;
decimal taxRate = 0.20m;

decimal total = price + price * taxRate;
decimal rounded = Math.Round(total, 2, MidpointRounding.AwayFromZero);

Console.WriteLine(rounded);

Измените цену и проверьте результат

Что почитать дальше по C#

Если нужен общий маршрут по теме, откройте рубрику C#. Для соседних задач пригодятся эти разборы:

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x