Javaに限らず、プログラムの世界における実数計算には誤差がつきものです。この誤差を解消する手段として、小数点以下の桁数に合わせて10の桁数乗を掛けて整数化する方法があります。しかし、この時、最上位の0を消し忘れると予期せぬ結果になるので注意が必要です。
例えば、実数のリテラル「3.11」、「1.12」、「0.77」の加算結果(回答は「5.0」)を表示するプログラムがあるとします。
3つの実数リテラルをそれぞれ100倍して整数にして加算し、表示するときに実数に戻してみたのですが、「4.86」という予期せぬ計算結果になってしまいました。
どうして0.14もの誤差が出てしまったのでしょうか。
原因は整数リテラルの3つの表記方法
この現象が起こる原因は、Javaの整数リテラルの表記方法に10進数、16進数、8進数の3つが存在していることにあります。整数リテラルの前に「0x」または「0X」をつけると16進数になることは良く知られていますが、整数リテラルの前に「0」をつけると8進数になることは知られていなかったり、忘れがちです。今回は「077」が8進数だと解釈されて、10進数の63として加算されてしまったわけです。そこで、先頭のゼロを削ると正しい値になります。
なお、8進数では数字の「0」から「7」までしか使いませんので、「081」などと表記すると8進数として不正になるため、意味の分かりづらいコンパイルエラーになってしまいます。先頭のゼロに注意しましょう。
Copyright © ITmedia, Inc. All Rights Reserved.