科学的記数法で数値をフォーマットする方法

JavaScriptで非常に大きな数値と非常に小さな数値を表示する方法を学ぶ

はじめに

科学的記数法は、数値を係数と10の累乗の積として表現します。例えば、123,000,000は1.23 × 10^8となり、0.000000456は4.56 × 10^-7となります。この形式により、非常に大きな数値や非常に小さな数値が読みやすく、比較しやすくなります。

科学データ、財務情報、技術的な測定値を表示するWebアプリケーションでは、このような方法で数値をフォーマットする必要があることがよくあります。JavaScriptはIntl.NumberFormat APIを通じて科学的記数法の組み込みサポートを提供しており、フォーマットとローカライゼーションの両方を処理します。

この記事では、科学的記数法で数値をフォーマットする方法、精度を制御する方法、ロケール固有の違いを理解する方法、科学的記数法と工学的記数法の選択方法を説明します。

科学的記数法で数値をフォーマットする

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よりも読みやすくなります。

非常に小さな数値をフォーマットする

科学的記数法は非常に小さな数値にも機能し、負の指数を使用して1未満の値を表現します。

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 と表示されます。

指数表記の精度を制御する

minimumSignificantDigitsmaximumSignificantDigits オプションは、書式設定された出力に表示される桁数を制御します。有効数字には、最初の非ゼロ桁から最後の桁までの係数のすべての桁が含まれます。

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に設定すると、出力が正確に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)などのSI接頭辞と一致します。

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となる場合など)、両方の表記は同じ結果を生成します。

指数表記と工学表記の使用例

指数表記は、メートル法の接頭辞との整合性よりも可読性と一貫性が重要なデータを表示するアプリケーションに適しています。

指数表記を使用する場合:

  • 科学計算機および計算ツール
  • 天文学アプリケーション(距離、質量、光度)
  • 化学アプリケーション(分子量、濃度)
  • 物理シミュレーション(粒子質量、電磁気値)

工学表記は、ユーザーがメートル法の接頭辞で考えたり、値を口頭で伝える必要がある場合に適しています。

工学表記を使用する場合:

  • 電子工学アプリケーション(キロオームの抵抗、ピコファラッドの静電容量)
  • 電気工学ツール(電圧、電流、電力)
  • 通信システム(メガヘルツの周波数、ギガビットのデータレート)
  • 機械工学(キロニュートンの力、ニュートンメートルのトルク)

選択は、ユーザーと領域によって異なります。指数表記はすべての数値に対して一貫した書式設定を提供し、工学表記はエンジニアが測定値を伝達する方法と整合します。