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

Ответ

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

Ответ 18+ 🔞

Так, слушай, вот тебе про Double и Decimal, а то народ путает их, как хуй с пальцем, а потом удивляется, почему копейки не сходятся.

Вот смотри, вся соль в том, как они внутри устроены. Это как сравнивать молоток и скальпель — оба инструменты, но для разного.

Double — быстрый, но иногда криворукий

  • Что внутри: Это 64-битное число с плавающей точкой, но точка-то бинарная (двоичная). По стандарту IEEE 754, если что.
  • Суть проблемы: Он супербыстрый и для расчётов в физике или графике — самое то. Но он переводит наши человеческие десятичные дроби (вроде 0.1) в двоичную систему. А там, блядь, некоторые дроби представляются бесконечной периодической дробью, как 1/3 в десятичной системе (0.33333...). Компьютер её обрезает. Отсюда и вылезают эти ебушки-воробушки — ошибки округления.
  • Когда юзать: Для всего, где скорость важнее абсолютной точности до последней копейки. Геолокация, графика, данные с датчиков.
let doubleResult = 0.1 + 0.2
print(doubleResult == 0.3) // false! Вот тебе и пиздец.
print(doubleResult) // 0.30000000000000004 (Видишь? Хвостик появился, манда с ушами!)

Decimal — точный, но не торопыга

  • Что внутри: А это уже 128-битное число с десятичной плавающей точкой. Оно думает, как человек, в десятичной системе.
  • В чём фишка: Оно гарантирует точность для операций с десятичными дробями, у которых конечное число знаков. Для денег — идеально. Никаких сюрпризов.
  • Цена точности: Работает медленнее Double и жрёт в два раза больше памяти (16 байт против 8). Но когда дело касается бабла, терпения ноль ебать — точность важнее.
  • Когда юзать: Финансы, бухгалтерия, расчёт налогов, процентов — везде, где ошибка на копейку это уже пиздец и аудит.
import Foundation
let decimalResult = Decimal(0.1) + Decimal(0.2)
print(decimalResult == Decimal(0.3)) // true! Вот, бля, красота.
print(decimalResult) // 0.3 (Чисто, аккуратно, в рот меня чих-пых)

Короче, табличка, чтобы в глаза бросалось

Критерий Double Decimal
Как считает По-компьютерному, двоично По-человечески, десятично
Точность для денег Хуёвая, будут хвосты Идеальная, что надо
Скорость Быстрее Тормознее
Память 8 байт 16 байт
Где применять Игры, графика, научный софт Банки, магазины, бухгалтерия

И главный вывод, который в лоб: Если ты делаешь что-то с деньгами и используешь Double — ты конченый идиот. Это не я говорю, это все баги финансовых отчетов кричат. Либо Decimal, либо считай всё в целых копейках/центах. Всё остальное — путь в ад с плавающей погрешностью.