/
Программирование
/
Курс JavaScript
/

Числа с плавающей точкой

JavaScript: Числа с плавающей точкой

В математике есть разные типы чисел. Например:

  • Натуральные: целые положительные числа: 1, 2, 3 и т.д.
  • Рациональные: дробные числа, которые можно представить в виде деления, например: 0.5, 1.75, 3.14.

С точки зрения математики всё просто. Но с точки зрения компьютера между этими типами чисел лежит настоящая пропасть. Попробуйте мысленно решить: сколько будет 0.2 + 0.1? Очевидно, 0.3. А вот что скажет JavaScript:

console.log(0.2 + 0.1); // => 0.30000000000000004

Вместо привычных 0.3 мы получаем 0.30000000000000004.

Ожидание:   0.1 + 0.2  →  0.3
Реальность: 0.1 + 0.2  →  0.30000000000000004
                             └── погрешность хранения

Почему так происходит?

Такое поведение характерно для JavaScript, Python, C++ и большинства других языков программирования.

Причина в устройстве компьютера. Компьютер работает с ограниченной памятью, тогда как рациональные числа бесконечно точны. Между 0.1 и 0.2 можно поместить бесконечно много других чисел. Но компьютер не может хранить бесконечность. Он приближает число, стараясь уместить его в доступное количество бит.

Такие приближённые значения называются числами с плавающей точкой (floating point numbers). Хранение и вычисления с ними подчиняются строгим правилам, описанным в специальном стандарте IEEE 754, на который ориентируются большинство языков программирования.

Когда появляются такие числа

Числа с плавающей точкой появляются в программах чаще, чем может показаться. Вот основные случаи:

  • Когда вы явно пишете дробное число, например 0.1, 2.5, 3.14.
  • Когда выполняете деление, даже если делите два целых числа:
console.log(1 / 2); // => 0.5
console.log(2 / 3); // => 0.6666666666666666

Даже если результат кажется «красивым», внутри он всё равно представлен в виде приближённого значения. Некоторые дроби, такие как 1 / 3, вообще не могут быть точно представлены в двоичной системе, поэтому их точность всегда ограничена.

Где это критично и как с этим работают

Обычно небольшая погрешность не мешает. Но в финансовых расчётах, научных и инженерных задачах, а также при точном сравнении результатов она может стать проблемой. Например, ошибка в доли копейки способна дать неправильную итоговую сумму, а длинная цепочка вычислений может постепенно накапливать неточность.

В реальных программах с этим работают по-разному. Деньги часто хранят в минимальных единицах, например в копейках, то есть используют целые числа вместо дробных. В других случаях результат округляют до нужного количества знаков, сравнивают числа с допустимой погрешностью или используют специальные библиотеки для точных вычислений.

Что нужно запомнить

Операции с числами с плавающей точкой не всегда точны, и это нормально. Такое поведение характерно для большинства языков программирования и объясняется устройством компьютерной памяти. Точность можно контролировать, например с помощью округления или сравнения чисел с заданной погрешностью. А при работе с деньгами, точными измерениями или научными расчётами лучше использовать специальные типы данных, которые обеспечивают контроль над точностью.

Задание

Вы оплачиваете два товара в интернет-магазине: первый стоит 0.1 рубля, второй — 0.2 рубля. Рассчитайте и выведите итоговую сумму.

Ожидаете увидеть 0.3 — но JavaScript выдаст кое-что интересное.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются