longの概要
| 整数型(他言語での利用例) JavaScript予約語 | ||
|
long 概要 わかりやすく説明 |
||
|
longの基本的な使い方(他言語の例)
JavaScript以外の言語(Javaなど)では、変数を宣言する瞬間に「これは long である」と明示する決まりになっています。
また、数値の末尾に L を付けることで、「これは小数ではなく、整数としての long です」という意思表示をするのが作法です。
// Javaでのlong型の使用例(※JavaScriptのコードではありません)
public class LongExample {
public static void main(String[] args) {
// 末尾の「L」は、これがlong型であることをコンパイラに伝える標識です
long largeNumber = 1234567890123456789L;
System.out.println("Large number: " + largeNumber);
}
}
- 他言語において
longを使う最大の理由は、メモリの節約ではなく「扱える数値の範囲を物理的に広げて、バグを防ぐ」ことにあります。
JavaScriptでの対応方法(BigInt型の活用)
JavaScriptで long に相当する機能を求めるなら、BigInt型を使います。
通常の Number型は「小数を扱うための仕組み(浮動小数点)」を流用しているため、桁が大きくなると端数が切り捨てられて正確さを失いますが、BigInt型は「整数のみ」に特化してメモリを動的に確保するため、理論上はメモリが許す限りいくらでも大きな整数を1の位まで正確に保持できます。
// 1. BigIntのリテラル表記(数値の末尾に「n」を付けます)
const largeNumber = 123456789012345678901234567890n;
// 2. コンストラクタを使って文字列から生成する方法
const anotherLargeNumber = BigInt("123456789012345678901234567890");
// 3. 計算結果も自動的にBigInt型として扱われます
console.log(largeNumber + anotherLargeNumber); // 出力: 246913578024691357802469135780n
// ⚠️ 注意:Number型と混ぜて計算しようとするとエラーになります
const regularNumber = 10;
// console.log(largeNumber + regularNumber); // 🛑 TypeError(型が違うため直接計算はできません)
console.log(largeNumber + BigInt(regularNumber)); // ⭕ これなら安全に計算可能です
BigInt型を生成するには、数値リテラルの末尾にnを付けるか、BigInt()関数に文字列を渡すのが基本です。- 通常の数値(
Number)との計算は型の食い違いにより即座にエラーとなるため、計算前にはBigInt(regularNumber)のように明示的な型変換が必要です。
注意点
- 予約語としての使用禁止:
longは JavaScript の予約語として厳重に保護されているため、let long = 10;のように変数名として使用するとSyntaxErrorが発生し、プログラムがその時点で停止します。 - 小数点計算の不可:
BigIntはその名の通り「整数専用」です。
3.14nのような小数を代入しようとしたり、BigIntをMath.sqrt()(平方根)のような小数点計算を前提とした関数に渡そうとするとエラーになるため注意してください。 - JSONデータとの相性:
BigIntは、Web通信で標準的に使われるJSON形式のデータ構造(JSON.stringify)にそのまま含めることができません。
API経由でデータをやり取りする場合、一度文字列(String型)に変換してから送受信する処理が必要になります。
よくある質問
- Q: なぜJavaScriptのNumber型は64ビットもあるのに、long型のような巨大な整数を正確に扱えないのですか?
- A: JavaScriptの
Number型は「IEEE 754」という規格に準拠した浮動小数点数であり、64ビットの中身すべてを整数として使っているわけではないからです。
その64ビットのうちの一部は「小数点の位置」や「プラスマイナスの符号」を記録するために切り分けられており、整数として精度を100%保証できるのは最大でも2の53乗 - 1(9,007,199,254,740,991、約9000兆)までと決まっています。
これを「精度が保証される最大整数(Number.MAX_SAFE_INTEGER)」と呼び、これを超えた数値を扱う場合には、完全に整数のみを管理するBigInt型が必要となります。 - Q: 今後、JavaScriptでも
longというキーワードが正式な型として導入される可能性はありますか? - A: 現時点ではその予定はありません。
JavaScriptの設計思想として、言語本体を複雑な型定義で肥大化させるよりも、既存のNumber型をベースにしつつ、必要に応じてBigInt型のような新しい機能を「独立した型」として追加していく方向性が定まっているためです。 - Q: 他言語からJavaScriptへデータを渡す際、long型がJavaScriptのNumber型に勝手に変換されてしまい、数値の下何桁かが狂ってしまいます。どうすればいいですか?
- A: その数値が JavaScript の安全な整数範囲(約9000兆)を超えている場合、必ず文字列(String)経由でデータを受け取るようにシステムの設計を変更してください。
サーバー側の言語(JavaやGo、Pythonなど)からJSONでデータを出力する際、数値を"1234567890123456789"のようにダブルクォーテーションで囲んで文字列として送ることで、JavaScript側でもBigInt(受け取った文字列)と安全に変換することができ、1の位まで正確なデータを維持したまま処理することが可能になります。// サーバーから文字列として届いた巨大なIDを安全に復元する const jsonResponse = '{ "userId": "9223372036854775807" }'; // JavaのLong.MAX_VALUEなど const data = JSON.parse(jsonResponse); const userId = BigInt(data.userId); // ⭕ 誤差ゼロで巨大な数値を扱えます
まとめ
longは、JavaScriptでは使用不可能な予約語ですが、プログラミング全般における「数値のメモリ管理と精度の関係」を知るための非常に重要な概念です。
- JavaScriptでは
Number型が万能な数値箱として機能しますが、約9000兆を超えるような天文学的な数値にはBigInt型という専門家を投入するという棲み分けがなされています。 - 他言語の
long型が必要な場面に直面したときは、迷わずBigIntを選択し、型を混ぜた計算によるエラーを防ぐための明示的な型変換を心がけましょう。 - 予約語を変数名(識別子)として使わないという基本的なルールを守りつつ、数値の精度が求められるシビアな開発現場では、常に「この数値は安全な範囲内か?」をチェックする習慣を身につけてください。