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#. Для соседних задач пригодятся эти разборы:
- C# с нуля: первый проект через dotnet new
- Console.ReadLine в C#: как считать текст и число
- Как установить .NET SDK для C#
- Классы и свойства в C#: первый пример