Как форматировать числа в инженерной нотации
Используйте инженерную нотацию для отображения чисел с показателями степени, соответствующими приставкам СИ
Введение
Инженерная нотация — это способ записи чисел с использованием степеней десятки, где показатель степени всегда кратен 3. Вместо того чтобы записывать 123 000 000 как 1,23×10⁸, в инженерной нотации это будет 123×10⁶. Такое соответствие степеней тройкам совпадает с приставками Международной системы единиц (СИ), такими как кило (10³), мега (10⁶) и гига (10⁹).
Эта нотация часто встречается в инженерии, электронике и науке, где измерения используют приставки СИ. Например, конденсатор с номиналом 4,7×10⁻⁶ фарад становится 4,7 микрофарада. Частота 2,4×10⁹ герц становится 2,4 гигагерца. Инженерная нотация делает такие преобразования естественными, потому что показатель степени напрямую соответствует приставке СИ.
В JavaScript есть встроенная поддержка инженерной нотации через API Intl.NumberFormat. Этот API автоматически выполняет преобразование и адаптирует форматирование под разные языки и регионы.
Что такое инженерная нотация
Инженерная нотация выражает числа как коэффициент, умноженный на степень десятки, где показатель степени всегда делится на 3. Например, число 987 654 321 в инженерной нотации будет 987,654×10⁶, а в выводе JavaScript — 987.654E6.
Коэффициент — это число от 1 до 999,999, за которым следует E и показатель степени. Буква E обозначает экспоненту и указывает на умножение на 10 в этой степени. Значение 987.654E6 означает 987,654 × 10⁶, что равно 987 654 000.
Этот формат отличается от стандартной десятичной записи, где все цифры пишутся с разделителями, например, 987 654 321. Он также отличается от компактной нотации, где используются буквы K, M и B для обозначения порядков. В инженерной нотации явно указывается степень десятки с помощью экспоненты.
Почему в инженерной нотации используются множители по три
Ограничение на множители по 3 связано с тем, что приставки СИ увеличиваются или уменьшаются в 1000 раз. Каждый шаг вверх по шкале приставок умножает на 10³, а каждый шаг вниз делит на 10³.
Рассмотрим приставки СИ для степеней числа 10:
- 10³ = кило (к)
- 10⁶ = мега (М)
- 10⁹ = гига (Г)
- 10¹² = тера (Т)
- 10⁻³ = милли (м)
- 10⁻⁶ = микро (мк)
- 10⁻⁹ = нано (н)
- 10⁻¹² = пико (п)
Когда число записано в инженерной нотации с показателем степени 6, это соответствует приставке мега. Если показатель степени -9, это соответствует приставке нано. Такая прямая связь делает инженерную нотацию удобной для технических областей, где преобладают единицы СИ.
Без этого ограничения пришлось бы выполнять вычисления в уме для перевода между нотацией и приставками СИ. Благодаря ограничению преобразование происходит мгновенно.
Чем инженерная нотация отличается от научной
Научная нотация тоже выражает числа через степени десяти, но использует минимально возможный показатель степени. Например, число 987 654 321 в научной нотации будет 9.87654321×10⁸, или 9.87654321E8.
В научной нотации перед запятой всегда стоит ровно одна ненулевая цифра. В инженерной нотации допускается до трёх цифр перед запятой, чтобы показатель степени делился на 3.
const scientificFormatter = new Intl.NumberFormat("en-US", {
notation: "scientific"
});
console.log(scientificFormatter.format(987654321));
// Output: "9.877E8"
const engineeringFormatter = new Intl.NumberFormat("en-US", {
notation: "engineering"
});
console.log(engineeringFormatter.format(987654321));
// Output: "987.654E6"
Научный форматер выдаёт 9.877E8 — одна цифра перед запятой. Инженерный форматер выдаёт 987.654E6 — три цифры перед запятой, чтобы получить показатель степени 6 вместо 8.
Обе записи обозначают одно и то же значение, но инженерная запись делает акцент на согласовании с приставками СИ, а не на минимизации показателя степени.
Использование инженерной записи в JavaScript
Опция notation в Intl.NumberFormat управляет тем, как отображаются числа. Если установить её в "engineering", будет использоваться инженерная запись.
const formatter = new Intl.NumberFormat("en-US", {
notation: "engineering"
});
console.log(formatter.format(1500));
// Output: "1.5E3"
console.log(formatter.format(1500000));
// Output: "1.5E6"
console.log(formatter.format(1500000000));
// Output: "1.5E9"
Форматтер автоматически выбирает подходящий показатель степени в зависимости от величины числа. Показатель степени всегда кратен 3, что обеспечивает соответствие приставкам СИ.
Вам не нужно самостоятельно вычислять правильный показатель степени или коэффициент. API Intl выполняет эти вычисления на основе значения числа.
Как инженерная запись форматирует разные порядки величин
Инженерная запись применяется для любых масштабов — от очень маленьких до очень больших чисел. Понимание того, как разные порядки величин соотносятся с показателями степени, поможет предсказывать результат.
const formatter = new Intl.NumberFormat("en-US", {
notation: "engineering"
});
console.log(formatter.format(0.0015));
// Output: "1.5E-3"
console.log(formatter.format(0.0000015));
// Output: "1.5E-6"
console.log(formatter.format(1.5));
// Output: "1.5E0"
console.log(formatter.format(1500));
// Output: "1.5E3"
console.log(formatter.format(1500000));
// Output: "1.5E6"
console.log(formatter.format(1500000000));
// Output: "1.5E9"
console.log(formatter.format(1500000000000));
// Output: "1.5E12"
Для малых чисел меньше 1 используются отрицательные показатели степени. Число 0.0015 становится 1.5E-3, что соответствует приставке милли. Число 0.0000015 становится 1.5E-6, что соответствует приставке микро.
Для чисел около 1 используется показатель степени 0. Число 1.5 становится 1.5E0, что эквивалентно 1.5 × 10⁰ = 1.5 × 1 = 1.5.
Для больших чисел используются положительные показатели степени. Число 1500 становится 1.5E3, что соответствует приставке кило. Этот принцип продолжается для приставок мега, гига и тера.
Управление количеством знаков после запятой в инженерной записи
По умолчанию форматтер добавляет несколько знаков после запятой в коэффициенте. Точность можно контролировать с помощью опций minimumFractionDigits и maximumFractionDigits.
const defaultFormatter = new Intl.NumberFormat("en-US", {
notation: "engineering"
});
console.log(defaultFormatter.format(1234567));
// Output: "1.235E6"
const noDecimalsFormatter = new Intl.NumberFormat("en-US", {
notation: "engineering",
maximumFractionDigits: 0
});
console.log(noDecimalsFormatter.format(1234567));
// Output: "1E6"
const twoDecimalsFormatter = new Intl.NumberFormat("en-US", {
notation: "engineering",
maximumFractionDigits: 2
});
console.log(twoDecimalsFormatter.format(1234567));
// Output: "1.23E6"
Опция maximumFractionDigits ограничивает количество знаков после запятой в коэффициенте. Если установить её в 0, все десятичные знаки будут убраны, и будет отображаться только целая часть коэффициента.
Вы также можете задать минимальное количество знаков после запятой, чтобы обеспечить единообразное форматирование нескольких чисел.
const formatter = new Intl.NumberFormat("en-US", {
notation: "engineering",
minimumFractionDigits: 2,
maximumFractionDigits: 2
});
console.log(formatter.format(1000));
// Output: "1.00E3"
console.log(formatter.format(1500));
// Output: "1.50E3"
console.log(formatter.format(1234567));
// Output: "1.23E6"
Это гарантирует, что все числа будут отображаться ровно с двумя знаками после запятой, что помогает поддерживать визуальную согласованность в таблицах и отчетах.
Как работает инженерная запись в разных локалях
Инженерная запись адаптируется к разным локальным правилам для разделителей дробной части. Формат экспоненты остается неизменным, а форматирование коэффициента меняется в зависимости от локали.
const enFormatter = new Intl.NumberFormat("en-US", {
notation: "engineering"
});
console.log(enFormatter.format(1234567));
// Output: "1.235E6"
const deFormatter = new Intl.NumberFormat("de-DE", {
notation: "engineering"
});
console.log(deFormatter.format(1234567));
// Output: "1,235E6"
const frFormatter = new Intl.NumberFormat("fr-FR", {
notation: "engineering"
});
console.log(frFormatter.format(1234567));
// Output: "1,235E6"
В английском языке в качестве разделителя дробной части используется точка. В немецком и французском — запятая. Буква E и экспонента остаются одинаковыми для всех локалей.
Локализация применяется только к коэффициенту. Обозначение экспоненты с помощью E и ее значение соответствуют международным научным стандартам и не меняются между локалями.
Совмещение инженерной записи с другими вариантами форматирования
Инженерная запись работает с другими вариантами форматирования чисел. Можно управлять округлением, значащими цифрами и отображением знака при использовании инженерной записи.
const formatter = new Intl.NumberFormat("en-US", {
notation: "engineering",
signDisplay: "always"
});
console.log(formatter.format(1500000));
// Output: "+1.5E6"
console.log(formatter.format(-1500000));
// Output: "-1.5E6"
Опция signDisplay определяет, будет ли у положительных чисел отображаться плюс. Если установить значение "always", знак будет показываться и для положительных, и для отрицательных значений.
Можно также управлять количеством значащих цифр вместо знаков после запятой.
const formatter = new Intl.NumberFormat("en-US", {
notation: "engineering",
minimumSignificantDigits: 4,
maximumSignificantDigits: 4
});
console.log(formatter.format(1234567));
// Output: "1.235E6"
console.log(formatter.format(1567890));
// Output: "1.568E6"
Опции minimumSignificantDigits и maximumSignificantDigits определяют общее количество значащих цифр в коэффициенте, а не только количество знаков после запятой.
Когда использовать инженерную запись
Инженерная запись лучше всего подходит для технических задач, где используются приставки СИ. Такая запись часто встречается в документации по электронике, научных статьях и инженерных спецификациях.
При документировании схемы с конденсатором на 4,7×10⁻⁶ фарада инженерная запись отображает значение как 4.7E-6. Инженеры сразу понимают, что это 4,7 микрофарада. При отображении частоты 2,4×10⁹ герц инженерная запись показывает 2.4E9, что для инженеров означает 2,4 гигагерца.
Эта запись менее подходит для широкой аудитории, которая может не понимать экспоненциальную запись. Для счетчиков в соцсетях, цен в интернет-магазинах и пользовательских дашбордов лучше использовать стандартную или компактную запись.
Не используйте инженерную запись, когда важна точность и имеют значение все цифры. Финансовые расчёты, юридические документы и аудит требуют точного десятичного представления. Баланс в банке должен отображаться как $1 234,56, а не 1.23456E3.
Учитывайте свою аудиторию. Инженеры, физики и технические специалисты ожидают и понимают инженерную запись. Обычным пользователям проще читать стандартную или компактную запись.