Это 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-му шагу.

Ссылки: