29

Проблемы чисел с плавающей точкой

Всем привет, работаю java разработчиком уже 10 лет, в этом посте хотел бы привести пример, почему нужно с опаской подходить к использованию чисел с плавающей точкой. Проблемы возникают из-за двух ограничений:

  • невозможности представить некоторые дробные числа в конечном виде в двоичной кодировке;

  • ограниченного объема памяти, выделенного для хранения значения.

В результате может страдать точность, причем в не самых очевидных случаях. Например, сравниваем между собой два маленьких различных числа. Они, очевидно, различны:

double little1 = 0.0000000000000000000000000000000000000001;
double little2 = 0.0000000000000000000000000000000000000002;
print(little1 == little2); //false

Далее попробуем сложить эти два числа с большим, и проверим, совпадают ли суммы:

double big = 10000000000000000000000000000000000000.0;

print(big + little1 == big + little2); //true

Оказывается что суммы равны, хотя интуиция подсказывает обратное. Проблема в том, что число которое имеет много символов до точки и после точки, не может быть достаточно точно представлено в памяти, и его конец обрезается. Из-за чего вычисления приводят к равенству.

Тем кто вынужден работать с нецелыми числами, рекомендую присмотреться к BigDecimal. Всем удачи!

Лига программистов

2.3K поста12K подписчиков

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества

8
Автор поста оценил этот комментарий
Этим страдает любой яп. Довольно сухой пост о том, как работают floating point числа. Почему страдает точность, почти ничего не сказано. Складывается ощущение, что просто потому что.

Либо человеку с 10ти летним опытом джавы просто лень было писать многа букаф , чтобы раскрыть тему, тогда к чему пост? Либо про 10 лет автор слукавил.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Решил написать пост с примером типа puzzlers для начинающих

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества