Это 33-й шаг к прохождению серии Программирование Просветление. Если вы не выучили 32шаг, прочтите его.
«95% людей вообще ничего не знают о плавающей запятой». ~ Джеймс Гослинг
Что такое числа с плавающей запятой?
Термин с плавающей запятой происходит от того факта, что не существует фиксированного количества цифр до и после десятичной точки; то есть десятичная точка может плавать.
В Java тип данных float
или Число с плавающей запятой — это 32-разрядное число с плавающей запятой одинарной точности IEEE 754.
В чем проблема с числами с плавающей запятой?
Для иллюстрации присвойте 2147483647 (наибольшее 32-битное целое число со знаком) 32-битной переменной с плавающей запятой (скажем, x) и напечатайте ее. Вы увидите 2147483648. Теперь выведите x - 64
. Все еще 2147483648. Теперь выведите x - 65
и вы получите 2147483520! Почему? Поскольку интервал между соседними числами с плавающей запятой в этом диапазоне равен 128, а операции с плавающей запятой округляются до ближайшего числа с плавающей запятой.
Числа с плавающей запятой IEEE — это числа с фиксированной точностью, основанные на экспоненциальном представлении с основанием два: 1.d1d2…dp-1 × 2e, где p — точность (24 для float, 53 для double). Расстояние между двумя последовательными числами составляет 21-p+e, что можно безопасно аппроксимировать ε|x|, где ε – машинный эпсилон (21-p).
Кроме того, если вы выполните следующее, вы будете удивлены
double x1 = 0.3; double x2 = 0.1 + 0.1 + 0.1; System.out.println(x1 == x2); // Prints false double z1 = 0.5; double z2 = 0.1 + 0.1 + 0.1 + 0.1 + 0.1; System.out.println(z1 == z2); // Prints True
TL;DR Не используйте числа с плавающей запятой для финансовых приложений. Помните об ошибках округления и кодируйте соответственно.
Перейти к 32этапу
Перейдите к 34-му шагу.
Ссылки:
- 97 вещей, которые должен знать каждый программист ~ Git Book
- 97 вещей, которые должен знать каждый программист ~ Мягкая обложка
- Типы с плавающей запятой ~ Oracle
- Что такое плавающая точка? ~ Принстон
- Примитивные типы данных в Java ~ Oracle
- Что должен знать каждый программист об арифметике с плавающей запятой ~ Oracle
- Двойной ~ Принстон