← Назад к вопросам

Что будет при сложении 0.2 и 0.1?

1.6 Junior🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Проблема точности представления чисел в JavaScript

При сложении 0.2 и 0.1 в JavaScript мы получаем неожиданный результат:

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

Это происходит из-за особенностей представления чисел в компьютерах и реализации стандарта IEEE 754 для чисел с плавающей точкой в JavaScript.

Почему возникает проблема точности?

Причина: двоичное представление десятичных чисел

JavaScript использует формат 64-bit floating point (double precision), где:

  • 1 бит для знака
  • 11 битов для экспоненты
  • 52 бита для мантиссы (значения)

Десятичные числа 0.1 и 0.2 в двоичной системе имеют бесконечную периодическую дробь:

// Двоичное представление (пример):
0.1 в двоичной ≈ 0.00011001100110011001100110011001100110011001100110011...
0.2 в двоичной ≈ 0.00110011001100110011001100110011001100110011001100110...

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

Аналогия с десятичной системой

Представьте, что вы пытаетесь точно выразить 1/3 в десятичной системе:

1/3 = 0.3333333333333333... (бесконечная дробь)

Если вы ограничите представление до 4 знаков после запятой:

0.3333 + 0.3333 = 0.6666

Но реальное значение должно быть 0.6666666666..., поэтому возникает ошибка.

Как избежать проблем с точностью?

Методы работы с дробными числами в JavaScript

1. Использование целых чисел для расчетов

Если вам нужна точность (например, для финансовых операций), работайте в целых числах:

// Вместо 0.1 + 0.2 используем 10 + 20 (центы вместо рублей)
const result = (10 + 20) / 100; // 0.3

2. Ограничение количества знаков после запятой

Для большинства практических случаев можно использовать округление:

const sum = 0.1 + 0.2;
const rounded = Math.round(sum * 100) / 100; // 0.3
const fixed = parseFloat(sum.toFixed(2)); // 0.3

3. Использование библиотек для точных вычислений

Для сложных финансовых или научных расчетов используйте специальные библиотеки:

// Пример с decimal.js
import { Decimal } from 'decimal.js';
const sum = new Decimal(0.1).add(new Decimal(0.2)); // 0.3

4. Сравнение чисел с учетом погрешности

При сравнениях никогда используйте прямое равенство:

// Плохой подход:
if (0.1 + 0.2 === 0.3) { // false
    console.log('Equal');
}

// Правильный подход:
function areEqual(a, b, epsilon = 0.000001) {
    return Math.abs(a - b) < epsilon;
}

if (areEqual(0.1 + 0.2, 0.3)) { // true
    console.log('Equal within tolerance');
}

Практическое применение знаний

Типичные ситуации в разработке:

  1. Финансовые расчеты: всегда используйте целые числа (центы, милли) или библиотеки типа decimal.js.
  2. Интерфейсы: при выводе чисел пользователю применяйте .toFixed() для форматирования.
  3. Сравнения в алгоритмах: учитывайте погрешность при сравнениях дробных чисел.
  4. Сохранение в базу данных: будьте осторожны с сериализацией чисел с плавающей точкой.

Пример реального кода:

// Практичный подход для фронтенда
function safeAddition(a, b, precision = 2) {
    const sum = a + b;
    return parseFloat(sum.toFixed(precision));
}

const totalPrice = safeAddition(0.1, 0.2); // 0.3

Заключение

Проблема 0.2 + 0.1 = 0.30000000000000004 является фундаментальной особенностью компьютерной арифметики, а не ошибкой JavaScript. Это следствие ограниченности двоичного представления десятичных дробей. Как фронтенд-разработчик, вы должны:

  • Понимать причину этой проблемы для грамотного объяснения в команде
  • Применять соответствующие методы обработки чисел в зависимости от контекста
  • Выбирать правильные библиотеки для специфических задач с требованиями высокой точности

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

Что будет при сложении 0.2 и 0.1? | PrepBro