Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: floating point, precision, rounding error, IEEE 754, binary representation

Откуда возникают погрешности вычислений с float?

Вопрос проверяет понимание причин возникновения ошибок округления при работе с числами с плавающей точкой в программировании.

Короткий ответ

Погрешности возникают из-за того, что числа с плавающей точкой хранятся в двоичной системе, а многие десятичные дроби (например, 0.1) не имеют конечного двоичного представления. Это приводит к округлению при сохранении, что накапливается в вычислениях. Стандарт IEEE 754 определяет формат хранения, но не устраняет эту фундаментальную проблему.

Длинный ответ

Причины погрешностей float

Числа с плавающей точкой (float/double) хранятся в памяти в двоичном виде согласно стандарту IEEE 754. Проблема в том, что многие десятичные дроби, такие как 0.1 или 0.2, не могут быть точно представлены конечным набором двоичных разрядов. Это аналогично тому, как дробь 1/3 в десятичной системе записывается бесконечной последовательностью 0.333..., но в двоичной системе такие несоответствия встречаются гораздо чаще.

Как это проявляется на практике

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

// Пример на JavaScript
console.log(0.1 + 0.2); // 0.30000000000000004

// Сравнение может дать неожиданный результат
console.log(0.1 + 0.2 === 0.3); // false

// Для точных денежных расчётов используют целые числа (копейки)
let price = 1999; // 19.99 в копейках
let tax = Math.round(price * 0.2); // 400 копеек
console.log((price + tax) / 100); // 23.99

Где это важно

  • Финансовые расчёты — никогда не используйте float, применяйте целые числа (например, копейки) или специальные библиотеки (BigDecimal в Java, decimal в Python).
  • Научные вычисления — погрешности допустимы, но нужно контролировать накопление ошибок.
  • Сравнение чисел — никогда не сравнивайте float через ===, используйте эпсилон-окрестность: Math.abs(a - b) < 1e-10.

Вывод

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

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#floating point

#precision

#rounding error

#IEEE 754

#binary representation

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.