Ответ
Типы 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для вычислений, где важна скорость и диапазон, а небольшая погрешность допустима (физика, координаты, статистика).