В чем разница между типами double и decimal в C#?

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

Ответ

Типы double и decimal предназначены для чисел с плавающей запятой, но имеют фундаментальные различия в представлении, точности и применении.

Критерий double (System.Double) decimal (System.Decimal)
Стандарт IEEE 754 (двоичный) Десятичный (base-10)
Размер 64 бита (8 байт) 128 бит (16 байт)
Точность ~15-16 десятичных знаков ~28-29 десятичных знаков
Диапазон Огромный (±5.0 × 10^−324 до ±1.7 × 10^308) Меньший (±1.0 × 10^−28 до ±7.9 × 10^28)
Основная проблема Ошибки двоичного представления (например, 0.1) Нет ошибок представления для десятичных чисел
Производительность Высокая (аппаратная поддержка FPU) Ниже (программная эмуляция)
Сфера применения Научные вычисления, 3D-графика, симуляции Финансовые расчеты, денежные суммы, бухгалтерия

Ключевой пример ошибки округления double:

double d = 0.1 + 0.2;
Console.WriteLine(d == 0.3); // False!
Console.WriteLine(d); // 0.30000000000000004

// Для decimal используется суффикс 'm'
decimal m = 0.1m + 0.2m;
Console.WriteLine(m == 0.3m); // True
Console.WriteLine(m); // 0.3

Рекомендация:

  • Используйте decimal для всех финансовых операций, где важна точность десятичных расчетов (цена, налог, процент).
  • Используйте double для вычислений, где важна скорость и диапазон, а небольшая погрешность допустима (физика, координаты, статистика).