Как форматировать числа в научной нотации?

Узнайте, как отображать очень большие и очень маленькие числа в JavaScript

Введение

Научная нотация выражает числа в виде коэффициента, умноженного на степень десяти. Например, 123 000 000 превращается в 1,23 × 10^8, а 0,000000456 — в 4,56 × 10^-7. Такой формат делает чрезвычайно большие и очень маленькие числа более удобочитаемыми и сравнимыми.

Веб-приложения, которые показывают научные данные, финансовую информацию или технические измерения, часто нуждаются в таком формате чисел. В JavaScript есть встроенная поддержка научной нотации через API Intl.NumberFormat, который отвечает и за форматирование, и за локализацию.

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

Форматирование чисел в научной нотации

Конструктор Intl.NumberFormat принимает опцию notation, которая определяет, как будут отображаться числа. Если установить notation в значение "scientific", числа будут форматироваться в научной нотации.

const formatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific'
});

console.log(formatter.format(987654321));
// Output: 9.877E8

Результат 9.877E8 означает 9,877 × 10^8. Символ E отделяет коэффициент от показателя степени.

Форматирование очень больших чисел

Научная нотация упрощает отображение очень больших чисел, представляя их в виде коэффициента и степени.

const formatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific'
});

console.log(formatter.format(6.02214076e23));
// Output: 6.022E23

console.log(formatter.format(299792458));
// Output: 2.998E8

console.log(formatter.format(7800000000));
// Output: 7.8E9

Число 6.02214076e23 (постоянная Авогадро) форматируется как 6.022E23, что гораздо удобнее для чтения, чем 602 214 076 000 000 000 000 000.

Форматирование очень маленьких чисел

Научная нотация также подходит для очень маленьких чисел, используя отрицательные показатели степени для значений меньше единицы.

const formatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific'
});

console.log(formatter.format(0.000000001));
// Output: 1E-9

console.log(formatter.format(0.00000000000000000016));
// Output: 1.6E-19

console.log(formatter.format(0.0000000456));
// Output: 4.56E-8

Число 0,00000000000000000016 (приблизительный заряд электрона в кулонах) форматируется как 1.6E-19, что избавляет от необходимости считать нули.

Форматирование научной нотации зависит от локали

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

const numberToFormat = 987654321;

// US English uses a period as the decimal separator
const usFormatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific'
});
console.log(usFormatter.format(numberToFormat));
// Output: 9.877E8

// Portuguese uses a comma as the decimal separator
const ptFormatter = new Intl.NumberFormat('pt-PT', {
  notation: 'scientific'
});
console.log(ptFormatter.format(numberToFormat));
// Output: 9,877E8

// German also uses a comma as the decimal separator
const deFormatter = new Intl.NumberFormat('de-DE', {
  notation: 'scientific'
});
console.log(deFormatter.format(numberToFormat));
// Output: 9,877E8

В локали американского английского результат 9.877E8 содержит точку, а в португальской и немецкой локалях 9,877E8 — запятую.

Управление точностью в научной нотации

Опции minimumSignificantDigits и maximumSignificantDigits определяют, сколько знаков будет в отформатированном результате. Значащие цифры включают все цифры коэффициента — от первой ненулевой до последней.

const formatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific',
  minimumSignificantDigits: 3,
  maximumSignificantDigits: 3
});

console.log(formatter.format(123456789));
// Output: 1.23E8

console.log(formatter.format(0.00045678));
// Output: 4.57E-4

Если обе опции задать равными 3, результат будет содержать ровно три значащих цифры. Без этих опций форматтер добавляет больше цифр из исходного числа.

Можно также задать разные минимальные и максимальные значения для переменной точности.

const formatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific',
  minimumSignificantDigits: 2,
  maximumSignificantDigits: 5
});

console.log(formatter.format(123456789));
// Output: 1.2346E8

console.log(formatter.format(100000000));
// Output: 1.0E8

Эта конфигурация позволяет использовать от 2 до 5 значащих цифр в зависимости от исходного числа.

Форматирование чисел в инженерной нотации

Инженерная нотация — это разновидность научной, где показатель степени всегда кратен 3. Это соответствует метрическим приставкам СИ, таким как кило (10^3), мега (10^6) и гига (10^9).

const formatter = new Intl.NumberFormat('en-US', {
  notation: 'engineering'
});

console.log(formatter.format(987654321));
// Output: 987.654E6

console.log(formatter.format(0.000000456));
// Output: 456E-9

Число 987 654 321 в инженерной нотации будет оформлено как 987.654E6, а в научной — как 9.877E8. Показатель степени 6 кратен 3.

Отличия научной и инженерной нотации

Главное отличие между научной и инженерной нотацией — способ выбора показателя степени. В научной нотации используется любой целый показатель, а в инженерной — только кратные 3.

const scientificFormatter = new Intl.NumberFormat('en-US', {
  notation: 'scientific'
});

const engineeringFormatter = new Intl.NumberFormat('en-US', {
  notation: 'engineering'
});

const testNumbers = [105900, 1234567, 0.00045];

testNumbers.forEach(num => {
  console.log(`Number: ${num}`);
  console.log(`Scientific: ${scientificFormatter.format(num)}`);
  console.log(`Engineering: ${engineeringFormatter.format(num)}`);
  console.log('---');
});

// Output:
// Number: 105900
// Scientific: 1.059E5
// Engineering: 105.9E3
// ---
// Number: 1234567
// Scientific: 1.235E6
// Engineering: 1.235E6
// ---
// Number: 0.00045
// Scientific: 4.5E-4
// Engineering: 450E-6
// ---

Для числа 105 900 научная запись даёт 1.059E5, а инженерная — 105.9E3. Когда научная запись уже использует множитель 3 (например, 1 234 567 превращается в 1.235E6), оба формата дают одинаковый результат.

Примеры использования научной и инженерной записи

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

Используйте научную запись для:

  • Научных калькуляторов и вычислительных инструментов
  • Астрономических приложений (расстояния, массы, светимости)
  • Химических приложений (молекулярные массы, концентрации)
  • Физических симуляций (массы частиц, электромагнитные значения)

Инженерная запись удобна для приложений, где пользователи мыслят в метрических приставках или им нужно озвучивать значения.

Используйте инженерную запись для:

  • Электронных приложений (сопротивления в килоомах, ёмкости в пикофарадах)
  • Инструментов для электротехники (напряжения, токи, мощности)
  • Телекоммуникационных систем (частоты в мегагерцах, скорости передачи в гигабитах)
  • Механической инженерии (силы в килоньютонах, моменты в ньютон-метрах)

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