解説
コンピュータは小数も2進数で記憶しますが、10進数の0.1は2進数では割り切れない無限小数になります。1/3=0.333… が10進数で表しきれないのと同じです。
そのため0.1や0.2はわずかに誤差を含んだ近似値として記憶され、足すと0.3ちょうどにはならず 0.30000000000000004 になります。
これはバグではなく、有限のビットで小数を表すことの宿命です。だから小数の比較は == ではなく「差が十分小さいか」で判定するのが正しいやり方です。
書き方
小数(float)は2進数で表すと割り切れず誤差を含む(0.1+0.2 が 0.3 ちょうどにならない)。 ・== は誤差があると False になるので小数の比較に不向き。 ・abs(値) で絶対値、abs(差) < 1e-9 で「ほぼ等しい」を判定(1e-9 は 10^-9)。 ・format(値, ".17f") で小数点以下17桁まで表示し誤差を見る。
書いて動かす
この回の課題
0.1 + 0.2 が 0.3 と == では一致しないことを確かめ、差を表示し、abs(差) < 1e-9 で「ほぼ等しい」と正しく判定しよう。
コードはあなたの端末の中だけで動きます(サーバーには送られません)。進み具合もこのブラウザに保存されます。
自分のPCでも続けてみませんか
Windows版 InsightPy は Python を同梱しているので、環境構築なしで同じコードを書いて実行できます。 書いたコードを保存しておけるほか、ステップ実行で変数の変化を1行ずつ確かめられます。 個人の学習や私的な目的でのご利用は、31日目以降も無料です(スクリプトの保存は10本まで)。 このブラウザ版の学習センターも、引き続き無料でお使いいただけます。