Math в C#: базовые функции и примеры

Краткое введение
Многие программы нуждаются в математических операциях для расчётов или форматирования чисел. В C# для этих задач используется статический класс Math. Он содержит функции для округления, тригонометрии, возведения в степень, извлечения корней и других базовых операций. Эти методы работают с типами int, double, float и т.д.
Важно: Math — это вспомогательный набор методов. Если вам нужны расширенные математические операции (например, статистика, сложная алгебра или линейная алгебра), рассмотрите специализированные библиотеки.
Как использовать базовые математические функции
Ниже перечислены часто используемые методы Math с пояснениями и примерами.
Math.Max
Max сравнивает два числа и возвращает большее. Существуют перегрузки для разных типов (int, double, float). Если нужно получить максимум из коллекции, можно последовательно сравнивать элементы или использовать LINQ.
Пример:
int max = Math.Max(4, 7);
Console.WriteLine(max); // вывод: 7Поиск максимума в списке (вручную):
var arrayMaxNumbers = new List() { 3, 6, 1, 8, 4, 1 };
int maxNumber = arrayMaxNumbers[0];
foreach (var num in arrayMaxNumbers)
{
maxNumber = Math.Max(maxNumber, num);
}
Console.WriteLine(maxNumber); // вывод: 8 Примечание: для коллекций проще и быстрее применять LINQ: arrayMaxNumbers.Max().
Math.Min
Min работает аналогично Max, но возвращает наименьшее значение.
int min = Math.Min(4, 7);
Console.WriteLine(min); // вывод: 4Поиск минимума в списке:
var arrayMinNumbers = new List() { 3, 6, -1, 8, 4, 1 };
int minNumber = arrayMinNumbers[0];
foreach (var num in arrayMinNumbers)
{
minNumber = Math.Min(minNumber, num);
}
Console.WriteLine(minNumber); // вывод: -1 Math.Abs
Abs возвращает абсолютное значение числа (расстояние от нуля). Результат всегда неотрицательный.
int absoluteNum = Math.Abs(5);
Console.WriteLine(absoluteNum); // вывод: 5
int absoluteNumNegative = Math.Abs(-5);
Console.WriteLine(absoluteNumNegative); // вывод: 5Math.Round
Round округляет число. Можно указать количество знаков после запятой. По умолчанию округление идёт до ближайшего целого; при половинных значениях действует Banker’s rounding (среднее округление к чётному) по умолчанию.
double roundedDecimals = Math.Round(40.12345, 2);
Console.WriteLine(roundedDecimals); // вывод: 40.12double roundedNum = Math.Round(40.6);
Console.WriteLine(roundedNum); // вывод: 41Важно: поведение округления можно настроить с помощью перегрузок и перечисления MidpointRounding.
Math.Truncate
Truncate отбрасывает дробную часть и возвращает целую часть числа (как double без десятичной дроби).
double truncatedNum = Math.Truncate(4.5);
Console.WriteLine(truncatedNum); // вывод: 4Базовые тригонометрические функции
Math содержит основные тригонометрические функции: Sin, Cos, Tan. Все принимают аргументы в радианах.
Совет: для перевода градусов в радианы используйте выражение radians = degrees * Math.PI / 180.
Math.Sin
double sinAngle = (90 * (Math.PI)) / 180;
Console.WriteLine(Math.Sin(sinAngle)); // вывод: 1Math.Cos
double cosAngle = (90 * (Math.PI)) / 180;
Console.WriteLine(Math.Cos(cosAngle)); // вывод: примерно 6.123e-17 (практически 0 из-за представления с плавающей точкой)Math.Tan
double tanAngle = (30 * (Math.PI)) / 180;
Console.WriteLine(Math.Tan(tanAngle)); // вывод: примерно 0.577Примечание: для углов, где косинус близок к нулю, значение тангенса может быть очень большим или нечисловым (Infinity). Следите за диапазоном входных значений.
Возведение в степень и квадратный корень
Math.Pow
Pow возводит число в степень.
double powNum = Math.Pow(5, 3);
Console.WriteLine(powNum); // вывод: 125Math.Sqrt
Sqrt возвращает квадратный корень. Для отрицательных аргументов результат — NaN.
double sqrtNum = Math.Sqrt(16);
Console.WriteLine(sqrtNum); // вывод: 4Практическое применение
Эти функции используются для форматирования, вычисления показателей, работы с геометрией, физикой, графикой и при подготовке данных для вывода или сохранения (например, в CSV). Их можно применять в консольных приложениях, веб-приложениях ASP.NET, службах и утилитах.
Важно: при работе с финансовыми вычислениями отдавайте предпочтение типу decimal, а не double, чтобы уменьшить ошибки округления.
Когда стандартные Math-функции не подходят
- Для статистических, линейных или специальных математических операций — используйте библиотеки (MathNet.Numerics, Accord.NET).
- Для высокоточной финансовой арифметики используйте decimal и методы округления с заданной логикой.
- Для векторной и матричной арифметики лучше применять специализированные типы и библиотеки.
Альтернативные подходы
- LINQ:
collection.Max(),collection.Min()— короче и читабельнее при работе с коллекциями. - MathNet.Numerics — расширенный пакет для научных вычислений.
- System.Numerics — для работы с большими числами и комплексными типами.
Мини-методология: как выбрать функцию
- Определите тип данных (int, float, double, decimal).
- Выберите подходящую перегрузку Math или специализированную библиотеку.
- Учтите требования к точности и поведению округления.
- Реализуйте тесты на крайних случаях (NaN, Infinity, минимальные/максимальные значения).
- Документируйте предположения о входных данных.
Критерии приёмки
- Функции возвращают ожидаемые значения для нормальных случаев (положительные числа, целые аргументы).
- Правильно обработаны граничные случаи: NaN, PositiveInfinity, NegativeInfinity.
- Для округления проверена логика на половинных значениях (0.5, 1.5 и т.д.) и соответствие требованиям (Banker’s rounding или MidpointRounding.AwayFromZero).
- Для тригонометрии проверены значения в ключевых точках (0°, 90°, 180° и т.д.) с допустимой погрешностью.
Тестовые случаи и примеры принятия
- Math.Max: входы (4,7) → 7; отрицательные числа; одинаковые значения.
- Math.Min: входы (4,7) → 4; массив с отрицательными числами.
- Math.Abs: (-5) → 5; (0) → 0.
- Math.Round: (2.5) — проверить поведение по умолчанию и с MidpointRounding.AwayFromZero.
- Math.Sqrt: (16) → 4; (-1) → NaN.
- Тригонометрия: Sin(90°) ≈ 1; Cos(90°) ≈ 0 (с учётом машинной точности).
Чек-лист по ролям
Разработчик:
- Использовать корректный тип данных.
- Выбирать нужную перегрузку Math.
- Обрабатывать NaN/Infinity.
QA:
- Проверить граничные случаи.
- Проверить поведение округления.
- Сравнить результаты с эталонными вычислениями.
Архитектор:
- Оценить необходимость сторонних библиотек.
- Учесть требования к точности и производительности.
Шпаргалка (cheat sheet)
- Math.Max(a, b) — максимум из двух.
- Math.Min(a, b) — минимум из двух.
- Math.Abs(x) — абсолютное значение.
- Math.Round(x[, digits[, MidpointRounding]]) — округление.
- Math.Truncate(x) — отбрасывание дробной части.
- Math.Sin(x), Math.Cos(x), Math.Tan(x) — тригонометрия в радианах.
- Math.Pow(x, y) — x в степени y.
- Math.Sqrt(x) — квадратный корень.
Риски и рекомендации
- Погрешности чисел с плавающей точкой — всегда учитывайте допустимую ошибку при сравнении double.
- Операции с большими степенями могут приводить к переполнению или Infinity.
- Округление «по умолчанию» может не соответствовать требованиям бухгалтерии — используйте явный MidpointRounding.
Важно: используйте decimal для финансовых расчётов и double для научных вычислений, где допустима небольшая погрешность.
Глоссарий
- NaN — «не число», результат недопустимой математической операции.
- Infinity — бесконечность, результат переполнения для плавающей точки.
- Рadian — единица измерения углов, используемая в тригонометрии.
- MidpointRounding — перечисление, отвечающее за поведение при округлении .5.
Краткое резюме
Класс Math покрывает большинство базовых нужд по математике в приложениях на C#. Для работы с коллекциями предпочитайте LINQ. Для сложной или высокоточной математики выбирайте специализированные библиотеки. Обязательно тестируйте граничные случаи и документируйте поведение округления.
Важно: если вы сохраняете значения в CSV или отображаете их пользователю, заранее договоритесь о формате округления и точности.
Похожие материалы
Gmail и настольные клиенты: выбор и настройка
SketchUp бесплатно: как начать 3D‑моделирование
Как создать аккаунт PlayStation Network (PSN)
Почему iPhone и iPad нагреваются и как это исправить
Как искать жильё на Airbnb для отпуска