JavaRush /Курсы /Модуль 1: Web Core /Работа с вещественными числами

Работа с вещественными числами

Модуль 1: Web Core
19 уровень , 0 лекция
Открыта

1.1 Округление вещественных чисел

Вещественные (дробные) числа по-английски называются floating point number – числа с плавающей точкой: в США для разделения целой и дробной части числа используется точка. Отсюда и происходит название float.

Как мы уже разбирали, при преобразовании вещественного числа (float) в целое (int), оно всегда округляется вниз до целого — его дробная часть просто отбрасывается. А ведь легко можно представить ситуацию, когда дробное число нужно округлить просто до ближайшего целого или вообще вверх. Что делать?

Для такого случая в JavaScript есть встроенная функция round(). Ее придумали еще до создания библиотеки Math, поэтому она не входит в нее. Функции же для округления вниз и округления вверх находятся в библиотеке math.

Фнукция Math.round()

Функция Math.round() округляет число до ближайшего целого:

    
      Math.round(вещественное_число)
    
  

Данная функция вернет целое число, к которому ближе переданное в нее вещественное.

Примеры:

Команда Результат
let x = Math.round(4.1); 4
let x = Math.round(4.5); 5
let x = Math.round(4.9); 5

Функция Math.ceil()

Функция Math.ceil() округляет число до целого вверх:

Команда Результат
let x = Math.ceil(4.1); 5
let x = Math.ceil(4.5); 5
let x = Math.ceil(4.9); 5

Функция Math.floor()

Функция Math.floor() округляет число до целого вниз:

Команда Результат
let x = Math.floor(4.1); 4
let x = Math.floor(4.5); 4
let x = Math.floor(4.9); 4

Если вам сложно запомнить эти команды, вам поможет небольшой урок английского:

  • math — математика
  • round — круг/округлять
  • ceiling — потолок
  • floor — пол

1.2 Устройство чисел с плавающей точкой

Тип number в JavaScript может хранить значения в диапазоне от -1.7*10308 до +1.7*10308. Такой гигантский диапазон значений объясняется тем, что тип number устроен совсем иначе по сравнению с целыми типами. Каждая переменная типа number содержит два числа: первое называется мантисса, а второе — степень.

Допустим, у нас есть число 123456789, и мы сохранили его в переменную типа number. Тогда число будет преобразовано к виду 1.23456789*108, и внутри типа number будут храниться числа — 1.23456789 и 8. Красным выделена «значащая часть числа» (мант́исса), синим — степень.

Такой подход позволяет хранить как очень большие числа, так и очень маленькие. Но т. к. размер числа ограничен 8 байтами (64 бита) и часть бит используется под хранение степени (а также знака числа и знака степени), максимальная длина мантиссы ограничена 15 цифрами.

Это очень упрощенное описание устройства вещественных чисел: более полное можно найти по ссылке.

1.3 Потеря точности при работе с вещественными числами

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

Последнее — самая неожиданная ситуация для новичков в программировании.

Если из числа 109 вычесть 1/109, мы получим опять 109.

Вычитание чисел слишком разных размерностей Объяснение
1000000000.000000000
-      0.000000001
1000000000.000000000
Второе число слишком маленькое, и его значащая часть игнорируется (выделено серым). Красным выделены 15 значащих цифр.

Что тут сказать, программирование — это не математика.

1.4 Опасность сравнения вещественных чисел

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

Пример:

Команда Пояснение
let a = 1000000000.0
let b = 0.000000001
let c = a – b
В переменной a будет значение 1000000000.0.
В переменной c будет значение 1000000000.0
(число в переменной b слишком маленькое).

В приведенном выше примере a и c не должны быть равны, но они равны.

Или возьмем другой пример:

Команда Пояснение
let a = 1.00000000000000001
let b = 1.00000000000000002
В переменной a будет значение 1.0.
В переменной b будет значение 1.0.

На практике вещественные числа сравнивают так:

Если разница чисел (по модулю) меньше, чем какое-то очень маленькое число, они считаются равными.

Пример:

JavaScript
    
      let a = 0.00000000012;
      let b = 0.000000000011;

      if (Math.abs(a - b) < 0.00001) {
        console.log("равны");
      } else {
        console.log("не равны");
      }
    
  
1
Задача
Модуль 1: Web Core, 19 уровень, 0 лекция
Недоступна
Округление числа
Округление числа
1
Задача
Модуль 1: Web Core, 19 уровень, 0 лекция
Недоступна
Сравнение вещественных
Сравнение вещественных
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vadim Makarenko Уровень 42
23 июля 2025
Поправьте написание подзаголовка: Функция Math.round() Мантисса включает в себя не только дробную, но и целую часть нормализованного вещественного числа, поэтому в пункте 1.2 необходимо 1. тоже покрасить красным цветом. Кроме того, значащая часть числа, строго говоря, это не синоним мантиссы. Для примера из лекции значащая часть числа 1.23456789 это 123456789 (все цифры, кроме нулей слева, если бы они были). А вот в числе 0.000000001, которое фигурирует ниже, оба термина будут соответствовать единице.