Ответ
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, либо считай всё в целых копейках/центах. Всё остальное — путь в ад с плавающей погрешностью.