整数リテラルの前にゼロを付けると8進数に注意JavaTips 〜Javaプログラミング編

» 2006年08月02日 10時00分 公開
[平野正喜@IT]

 Javaに限らず、プログラムの世界における実数計算には誤差がつきものです。この誤差を解消する手段として、小数点以下の桁数に合わせて10の桁数乗を掛けて整数化する方法があります。しかし、この時、最上位の0を消し忘れると予期せぬ結果になるので注意が必要です。

 例えば、実数のリテラル「3.11」、「1.12」、「0.77」の加算結果(回答は「5.0」)を表示するプログラムがあるとします。

画面1 実数計算の場合は結果が「5.0」 画面1 実数計算の場合は結果が「5.0」

 3つの実数リテラルをそれぞれ100倍して整数にして加算し、表示するときに実数に戻してみたのですが、「4.86」という予期せぬ計算結果になってしまいました。

画面2 整数計算にしたら「4.86」という異なる結果に 画面2 整数計算にしたら「4.86」という異なる結果に

 どうして0.14もの誤差が出てしまったのでしょうか。

原因は整数リテラルの3つの表記方法

 この現象が起こる原因は、Javaの整数リテラルの表記方法に10進数、16進数、8進数の3つが存在していることにあります。整数リテラルの前に「0x」または「0X」をつけると16進数になることは良く知られていますが、整数リテラルの前に「0」をつけると8進数になることは知られていなかったり、忘れがちです。今回は「077」が8進数だと解釈されて、10進数の63として加算されてしまったわけです。そこで、先頭のゼロを削ると正しい値になります。

画面3 正しい結果 画面3 正しい結果

 なお、8進数では数字の「0」から「7」までしか使いませんので、「081」などと表記すると8進数として不正になるため、意味の分かりづらいコンパイルエラーになってしまいます。先頭のゼロに注意しましょう。

画面4 8進数として不正というコンパイルエラー 画面4 8進数として不正というコンパイルエラー

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。