Learn JavaScript

Math.fround() - метод для приведения числа к 32-битной точности в JavaScript

Math.fround() приводит число к точности 32-битного числа с плавающей точкой.

Это не обычное округление до целого. Метод нужен для случаев, когда важно получить поведение, близкое к float32.

Синтаксис

Math.fround(x)

x - число, которое нужно привести к 32-битной точности.

Что делает Math.fround()

Метод берёт обычное число JavaScript и возвращает его версию с точностью float32.

console.log(Math.fround(1.5));   // 1.5
console.log(Math.fround(1.337)); // 1.3370000123977661

Иногда значение остаётся тем же, а иногда становится чуть другим.

Это происходит потому, что float32 хранит число менее точно, чем обычный number в JavaScript.

Что возвращает Math.fround()

Math.fround() возвращает число типа number.

const result = Math.fround(1.337);

console.log(result);        // 1.3370000123977661
console.log(typeof result); // "number"

То есть результат всё равно остаётся типом number, просто значение уже приведено к 32-битной точности.

Это не Math.round()

Очень важно не путать Math.fround() с обычным округлением.

console.log(Math.round(1.337));  // 1
console.log(Math.fround(1.337)); // 1.3370000123977661
  • Math.round() округляет до целого
  • Math.fround() меняет точность представления числа

Это вообще разные задачи.

Почему число меняется

Не каждое десятичное число можно точно представить в формате float32.

Поэтому после Math.fround() значение иногда выглядит странно:

console.log(Math.fround(1.337)); // 1.3370000123977661

Это нормальное поведение метода, а не ошибка.

Когда результат не меняется

Некоторые числа хорошо представимы и остаются теми же.

console.log(Math.fround(1.5)); // 1.5
console.log(Math.fround(2));   // 2

Очень большие и очень маленькие числа

Из-за ограничения float32 очень большие значения могут превратиться в Infinity, а очень маленькие - в 0.

console.log(Math.fround(1e100)); // Infinity
console.log(Math.fround(1e-50)); // 0

Это хороший пример того, что Math.fround() именно снижает точность и диапазон представления.

Неявное приведение типов

Как и многие методы Math, Math.fround() сначала пытается привести аргумент к числу.

console.log(Math.fround("1.5")); // 1.5
console.log(Math.fround(null));  // 0
console.log(Math.fround(true));  // 1

На практике обычно лучше передавать уже готовое число.

NaN и Infinity

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

console.log(Math.fround(NaN));       // NaN
console.log(Math.fround(Infinity));  // Infinity
console.log(Math.fround(-Infinity)); // -Infinity

Math.fround() и обычный number

В JavaScript все обычные числа имеют формат number, который точнее, чем float32.

Именно поэтому результат Math.fround() может не совпадать с исходным значением:

console.log(Math.fround(1.337) === 1.337); // false

Когда это полезно

Math.fround() удобно использовать, когда:

  • нужно привести число к точности float32
  • важно повторить поведение WebGL, TypedArray или другой среды с 32-битными float
  • вы хотите явно увидеть, как число будет храниться в Float32Array

Пример:

const value = 1.337;

console.log(Math.fround(value));

Math.fround() и Float32Array

По смыслу Math.fround() близок к записи числа в Float32Array.

const value = 1.337;

console.log(Math.fround(value)); // 1.3370000123977661

То есть метод полезен, когда нужно заранее понять, как число переживёт потерю точности.

Частые ошибки

Думать, что это обычное округление

console.log(Math.fround(1.337)); // 1.3370000123977661

Метод не округляет до целого и не форматирует число “красивее”. Он просто приводит его к точности float32.

Удивляться, что число стало чуть другим

console.log(Math.fround(1.337) === 1.337); // false

Это и есть основная суть метода.

Использовать Math.fround() без реальной необходимости

Для обычного прикладного кода этот метод нужен редко.

Чаще всего его используют там, где действительно важна 32-битная точность.

Быстрая памятка

  • Math.fround() приводит число к точности float32
  • метод возвращает number
  • это не округление до целого
  • результат может немного отличаться от исходного числа
  • очень большие числа могут стать Infinity
  • очень маленькие числа могут стать 0

Коротко

Math.fround() - это способ явно привести число к 32-битной точности в JavaScript. Главное, что стоит запомнить: метод не округляет до целого, а снижает точность представления числа, поэтому результат иногда выглядит чуть иначе, чем исходное значение.