【入門編】 Numberプリミティブ型とIEEE 754 – JavaScript実践ガイド

こんにちは!フロントエンドの世界へようこそ。
コードを書いていると、ふと「あれ、計算結果がなんかおかしい……?」と首を傾げたことはありませんか?

「0.1 + 0.2」を計算したら「0.30000000000000004」になる。
初めてこれを見たとき、多くのエンジニアが「JavaScriptが壊れた!」と焦るものです。でも、安心してください。これはJavaScriptが壊れているわけではなく、コンピュータが数値を扱うときの「ちょっとした事情」を知るだけで解決できる問題なんです。

今日は、この「数値のミステリー」を、専門用語に溺れることなく紐解いていきましょう。

—

なぜコンピュータは「0.1 + 0.2」が苦手なのか?

私たちが普段使う「10進数(0, 1, 2…9で数える方法)」と、コンピュータが使う「2進数(0と1だけで数える方法)」。この言語の違いが、すべての事件の始まりです。

想像してみてください:割り切れない「1/3」

私たちは10進数で「1 ÷ 3」を計算するとき、「0.33333…」と無限に続きますよね。どこかで切り捨てないと書き切れません。

コンピュータも同じです。2進数の世界では、「0.1」や「0.2」といった単純な数字が、「無限に続く割り切れない小数」になってしまうんです。

「IEEE 754」という名の「小さな箱」

JavaScriptは、数値を「IEEE 754(アイ・トリプルイー ななごーよん)」というルールに従って、64ビットという決まったサイズの箱に詰め込みます。

この箱はとても高性能ですが、無限に続く小数をすべて入れることはできません。ある程度のところで「もう入らないから、ここで切り捨てちゃおう!」と端っこをカットしてしまうのです。この「切り捨てられた誤差」が積み重なって、0.30000000000000004のような不思議な数字を生み出します。

—

現場で遭遇する「罠」と対処法

この誤差問題、特にお買い物サイトのカート機能や、ポイント計算のような「お金」を扱うときには致命的になります。1円の誤差も許されませんからね。

1. 「整数」で計算して、最後に直す

一番賢いやり方は、「小数を扱わない」ことです。
例えば、100円の計算をするなら、あえて「10000銭」のように整数にして計算し、最後に100で割るのです。

// 0.1 + 0.2 の正しい計算方法
const a = 0.1;
const b = 0.2;

// 一旦10倍して整数にしてから足し算する
const result = (a 10 + b 10) / 10;

console.log(result); // ちゃんと「0.3」になります!

2. 「toFixed」で見た目を整える

「計算結果を表示するだけ」なら、`toFixed()` を使うのも一つの手です。これは、「小数点以下何桁まで表示するか」を指定するメソッドです。

const calculation = 0.1 + 0.2;

// 小数点第1位まで表示する(結果は文字列になります)
console.log(calculation.toFixed(1)); // “0.3”

—

知っておくと楽になる「Number」の限界

JavaScriptの数値型には、もう一つだけ知っておいてほしい「限界」があります。
それは、「大きすぎる数字は正確に数えられない」ということです。

JavaScriptで扱える安全な最大値は `Number.MAX_SAFE_INTEGER` という定数で確認できます。

// JavaScriptが「正確に」扱える限界の数字
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991

// これを超えると…
console.log(9007199254740991 + 1 === 9007199254740991 + 2); // true になっちゃう!

「えっ、数字が増えないの?」と驚きますよね。これも箱のサイズが決まっているからです。
もし、Webアプリでとんでもなく大きな数字や、正確な金融計算を扱う必要がある場合は、`BigInt` という別の型を使うのが現代のJavaScriptの常識です。

—

最後に:完璧主義にならなくて大丈夫

ここまで読んで「うわ、JavaScriptって難しいな」と感じたかもしれません。でも、安心してください。

現場のベテランたちも、最初はみんなここでつまずきます。大切なのは、「コンピュータは完璧な計算機ではなく、実はちょっと大雑把なところがある」と知っておくこと。それだけで、バグが出たときに「あ、これは浮動小数点の誤差だな!」とすぐに気づけるようになります。

プログラミングは、こうした「コンピュータの性格」と仲良くなる旅のようなものです。焦らず、少しずつ理解を深めていきましょう。

次回のコードで、「0.1 + 0.2」に出会ったら、ぜひニヤリとしてくださいね。それが、あなたがスペシャリストに一歩近づいた証拠ですから!

コメント

タイトルとURLをコピーしました