2進浮動小数点数で計算するほぼすべての電卓に 0.1 + 0.2 と入力すると、生の答えは 0.3 ではなく 0.30000000000000004 になります。この電卓も内部では同じ値を計算していますが、表示の際に丸めるため、画面には 0.3 と表示されます。原因は基数の不一致です。人間は10進数で数を書きますが、コンピューターは2進数で数を保存しており、0.1は2進数では正確に表現できないのです。
要点まとめ
0.1 + 0.2はどの言語でも2進浮動小数点数では0.30000000000000004になる。- 2進数における0.1は循環小数で、
0.0001100110011…と続く。- この電卓は結果を有効数字12桁に丸めて表示するため、生の倍精度浮動小数点数ではなく
0.3と表示される。- 0.1を保存すると実際には
0.10000000000000000555111512312578…という値になる。
余分な桁はどこから来るのか
一部の分数が10進数できれいに表現できないことはご存知でしょう。3分の1は 0.333… と無限に続きます。これは3が10の約数ではないからです。コンピューターは2進数で数を保存しますが、2進数できれいに表現できる分数は分母が2のべき乗のもの、つまり2分の1、4分の1、8分の1などに限られます。10分の1はそのリストに含まれません。2進数で0.1は 0.0001100110011… と、10進数で3分の1が循環するのとまったく同じように無限に循環します。
倍精度浮動小数点数は数値部分に53ビットしか持たないため、無限に続く2進展開はどこかで打ち切られます。0.1と入力したときに実際に保存される値は 0.1000000000000000055511151231257827021181583404541015625 です。これは0.1に近い値ですが、正確に0.1ではありません。このわずかにずれた値を2つ足すと、誤差は打ち消し合うのではなく積み重なり、合計は0.3をわずかに超えたところに着地します。これが 0.30000000000000004 になる理由です。これはIEEE 754という標準規格に基づくもので、事実上すべてのプロセッサーと言語で実装されているため、JavaScript、Python、C、Excelでも同じ答えが得られます。
この電卓が行っている対処
このサイトの運用ルールは浮動小数点演算ガイドに明記されている通りで、すべての計算結果は表示前に有効数字12桁に丸められます。倍精度浮動小数点数はおよそ15から17桁の信頼できる数字を持っているため、12桁で丸めることで信頼できる桁はすべて残しつつ、誤差が蓄積している末尾の数桁だけを落とすことができます。
計算例1: 実際に入力してみる。 メインの電卓で 0.1+0.2 と入力してみてください。表示は 0.3 になります。内部の倍精度浮動小数点数は 0.30000000000000004 ですが、表示ルールがそれを隠しています。逆方向でも同じことが起こります。0.3-0.2 の生の計算結果は 0.09999999999999998 ですが、表示は 0.1 になります。掛け算でも同様です。1.1*3 は内部的には 3.3000000000000003 を保持していますが、表示は 3.3 です。
答えが本当に確定できない場合、この電卓はごまかしません。1/3 と入力すると 0.333333333333 と表示され、3が12個続いたところで止まります。この丸め方と表示上の限界については、有効数字ガイドで詳しく説明しています。
この違いが問題になる場面
日常の計算、宿題、工学的な概算では、有効数字12桁はどんな測定値よりもはるかに高い精度です。この差が問題になるのは、浮動小数点演算ガイドで解説されている次の3つの限られた場面です。
- お金の計算。通貨を浮動小数点数として保存してはいけません。ペンスやセントを整数として扱うのが安全な方法であり、小さな誤差の積み重ねは会計上の既知のバグの一種です。
- コード上の等価判定。計算された2つの浮動小数点数が等しいかどうかを直接テストするのは信頼できません。代わりに小さな許容誤差を設けて比較します。
- 長い一連の演算。誤差は蓄積していき、ほぼ等しい2つの数を引き算すると精度が最も大きく失われます。
計算例2: 正確な分数。 正確に正しい分数が必要な場合、分数電卓は分子と分母を整数のまま保持し、決して丸めません。そこで 1/3 + 1/3 + 1/3 と入力すると、正確に 1 が返ります。同じ計算を表示上の小数で行うと、0.333333333333 + 0.333333333333 + 0.333333333333 の結果は 0.999999999999 になります。考え方は同じでも、結果はまったく別の世界です。
計算例3: 平方根と2乗。 sqrt(2)^2 は典型的な落とし穴です。論理的には2の平方根を2乗すれば2になるはずです。この電卓上では生の計算結果は 2.0000000000000004 で、表示では 2 に丸められます。正確な値が必要な場合は、根号の形のまま最後の1回だけ計算するとよく、これについては電卓の関数リファレンスの √ キーの項目で解説しています。
もう一つ知っておくべき整数の境界があります。2^53 − 1 = 9,007,199,254,740,991 未満であれば、すべての整数を正確に表現でき、電卓はそのすべての桁を表示します。この線を超えると、19! のような値は、存在しない精度を主張しないよう科学的記数法に切り替わります。
よくある質問
0.1 と 0.2 を足すと本当に0.3になるのか、それともならないのか?
正確な10進演算では0.3になります。一方、2進浮動小数点数では、保存される結果は 0.30000000000000004 です。この電卓も内部では同じ値を返しますが、表示のために有効数字12桁に丸めるため、画面には 0.3 と表示されます。
これは電卓のバグなのか?
いいえ、違います。これは主要なプロセッサーや言語のほぼすべてが実装しているIEEE 754という標準規格によるものです。この問題を回避しているように見えるプログラムや電卓は、この電卓と同じように表示上の丸めによって問題を隠しているだけです。
正確な答えを得るにはどうすればよいか?
有理数の演算には決して丸めを行わない分数電卓を使うか、sqrt(2) や pi のような記号形式のまま式の中に保持しておき、最後のステップまで評価しないようにしてください。
1を3で割ると、なぜ3が12個しか表示されないのか?
3分の1は10進数でも2進数でも正確に表現できないためです。この電卓は値がきりよく終わるふりをするのではなく、信頼できる12桁を表示したところで止まります。