Ответ
Double и Decimal служат для разных целей из-за фундаментального различия в представлении чисел: бинарное с плавающей точкой vs десятичное с фиксированной точностью.
Double
- Представление: 64-битное число с бинарной плавающей точкой (стандарт IEEE 754).
- Точность: Высокая производительность, широкий диапазон значений, но возможны ошибки округления при операциях с десятичными дробями из-за перевода в двоичную систему.
- Использование: Научные вычисления, геолокация, компьютерная графика — где скорость критична, а небольшая погрешность допустима.
let doubleResult = 0.1 + 0.2
print(doubleResult == 0.3) // false!
print(doubleResult) // 0.30000000000000004 (погрешность)
Decimal
- Представление: 128-битное число с десятичной плавающей точкой.
- Точность: Обеспечивает точные вычисления с десятичными дробями. Идеально для операций, где важна абсолютная точность, особенно с конечным числом знаков после запятой.
- Использование: Финансовые расчеты (деньги, проценты), бухгалтерские приложения, любые операции, где ошибка округления недопустима.
- Производительность: Работает медленнее, чем
Double, и занимает больше памяти.
import Foundation
let decimalResult = Decimal(0.1) + Decimal(0.2)
print(decimalResult == Decimal(0.3)) // true!
print(decimalResult) // 0.3 (точно)
Сравнительная таблица
| Критерий | Double | Decimal |
|---|---|---|
| Основа | Двоичная (base-2) | Десятичная (base-10) |
| Точность для денег | Не подходит (погрешность) | Идеально |
| Скорость | Высокая | Ниже |
| Память | 8 байт | 16 байт |
| Пример использования | Координаты, сенсорные данные | Цены, налоги, проценты |
Почему это важно? Использование Double для финансовых расчетов — распространенная ошибка, ведущая к накоплению ошибок округления и некорректным итоговым суммам. Всегда используйте Decimal (или целочисленные типы в младших единицах, например, центы) для работы с деньгами.