← Назад к вопросам

В чем разница между хранением чисел Double и Decimal?

1.0 Junior🔥 181 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Double и Decimal в C#

Основное предназначение

Double (System.Double, double) - это 64-битное число с плавающей запятой двойной точности, оптимизированное для вычислений с максимальной производительностью и широким диапазоном значений. Используется для научных вычислений, графики, физических симуляций.

Decimal (System.Decimal, decimal) - это 128-битное десятичное число с фиксированной точкой, предназначенное для финансовых и денежных расчетов, где критически важна точность десятичных дробей без ошибок округления.

Ключевые различия

1. Внутреннее представление и точность

// Double - двоичное представление (IEEE 754)
double d = 0.1 + 0.2; // Результат: 0.30000000000000004

// Decimal - десятичное представление
decimal m = 0.1m + 0.2m; // Результат: 0.3 (точно)

Double использует двоичное представление, что приводит к известной проблеме с десятичными дробями. Decimal хранит число как целое значение с масштабным коэффициентом (96-битное целое + масштаб 0-28), гарантируя точное представление десятичных дробей.

2. Диапазон значений

// Double имеет огромный диапазон
double maxDouble = double.MaxValue;     // ~1.79769313486232E+308
double minDouble = double.MinValue;     // ~-1.79769313486232E+308

// Decimal имеет меньший диапазон, но большую точность
decimal maxDecimal = decimal.MaxValue;  // 79228162514264337593543950335
decimal minDecimal = decimal.MinValue;  // -79228162514264337593543950335

3. Производительность

// Операции с double значительно быстрее
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++)
{
    double result = Math.Sin(i * 0.01); // Аппаратное ускорение
}
sw.Stop();
Console.WriteLine($"Double: {sw.ElapsedMilliseconds} ms");

// Decimal медленнее в 10-100 раз
sw.Restart();
for (int i = 0; i < 1000000; i++)
{
    decimal result = decimal.Add(i, 1); // Программная эмуляция
}
Console.WriteLine($"Decimal: {sw.ElapsedMilliseconds} ms");

Double операции часто выполняются на аппаратном уровне (FPU), тогда как Decimal реализован программно.

4. Использование памяти

// Размер в памяти
int doubleSize = sizeof(double);    // 8 байт (64 бита)
int decimalSize = sizeof(decimal);   // 16 байт (128 бит)

5. Особенности использования

Для Double:

  • Используется по умолчанию для дробных чисел (литералы без суффикса)
  • Поддерживает специальные значения: NaN, PositiveInfinity, NegativeInfinity
  • Имеет проблемы с точностью при операциях с десятичными дробями

Для Decimal:

  • Требует суффикс m или M для литералов
  • Не поддерживает бесконечность и NaN
  • Всегда точно представляет десятичные дроби

Практические рекомендации

Используйте Double когда:

  • Требуется высокая производительность
  • Работаете с научными расчетами, графикой
  • Диапазон значений превышает возможности decimal
  • Небольшие ошибки округления допустимы

Используйте Decimal когда:

  • Выполняете финансовые расчеты (деньги, проценты, налоги)
  • Требуется точное десятичное представление
  • Работаете с валютами и бухгалтерскими операциями
  • Важна точность округления по десятичной системе

Пример финансового расчета

// НЕПРАВИЛЬНО для финансов
double price = 19.99;
double tax = price * 0.08; // 1.5992000000000002
double total = price + tax; // 21.589200000000003

// ПРАВИЛЬНО для финансов
decimal priceDecimal = 19.99m;
decimal taxDecimal = priceDecimal * 0.08m; // 1.5992
decimal totalDecimal = priceDecimal + taxDecimal; // 21.5892
decimal roundedTotal = Math.Round(totalDecimal, 2); // 21.59

Особенности в .NET

В .NET Decimal реализован как структура с перегруженными операторами, обеспечивающими точные вычисления. Это ценность типа, а не примитив в традиционном смысле, что объясняет более низкую производительность по сравнению с Double.

Выбор между Double и Decimal - это классический компромисс между производительностью и точностью. Для большинства бизнес-приложений, особенно финансовых, Decimal является предпочтительным выбором, несмотря на снижение производительности, поскольку точность расчетов критически важна. Для научных и инженерных задач, где важна скорость и диапазон значений, Double остается оптимальным выбором.

В чем разница между хранением чисел Double и Decimal? | PrepBro