В чем разница между типами Double и Decimal для работы с числами с плавающей запятой?

«В чем разница между типами Double и Decimal для работы с числами с плавающей запятой?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 (или целочисленные типы в младших единицах, например, центы) для работы с деньгами.