Какой тип данных в C# более оптимален для денежных операций?

«Какой тип данных в C# более оптимален для денежных операций?» — вопрос из категории C# Core, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для финансовых расчётов в C# следует использовать тип decimal. Он предназначен для точных десятичных вычислений и минимизирует ошибки округления, характерные для двоичных типов с плавающей запятой (float, double).

Почему decimal?

  • Точность: decimal использует десятичное представление (base-10), что соответствует человеческим денежным единицам. float и double — двоичные (base-2), что приводит к неточностям при операциях с десятичными дробями.
  • Диапазон и точность: decimal имеет меньший диапазон, но большую точность (28-29 значащих цифр), что идеально для денежных сумм.

Пример использования:

decimal price = 19.99m;
decimal taxRate = 0.20m; // 20%
decimal tax = price * taxRate; // 3.998m
decimal total = price + tax; // 23.988m (точный результат)

Сравнение с double (не рекомендуется для денег):

double doublePrice = 19.99;
double doubleTax = doublePrice * 0.20;
// doubleTax может быть равен 3.9980000000000004, а не 3.998

Компромисс: decimal занимает 16 байт (против 8 у double) и операции с ним медленнее. Однако для денежных операций точность всегда приоритетнее производительности. Для высокочастотных вычислений, не требующих абсолютной точности (например, научные расчёты), используют double.