【まるめごさ】

丸め誤差 とは?

最終更新:
💡 限られた桁で数を表すと、元の値とズレが出る

数値を限られた桁数や精度で表すために丸めたとき、元の値との間に生じる差。2進浮動小数点で0.1を正確に表せない例や、計算結果を丸める際にも現れる。

📌 このページのポイント
有限の精度に丸めたときの差 10進の0.10.1有限桁で表せる1/102進の0.10.000110011…無限に続く有限ビットでは近似JavaScript Number の例0.1 + 0.20.30000000000000004整数の単位10進の型許容差用途に合う精度と丸め規則を選ぶ10進の型でも割り算などでは丸めが必要
0.1は2進数で無限に続くため、有限ビットでは近い値に丸める。計算結果はJavaScript Numberの例。精度や対策は用途に合わせて選ぶ。
ひよこ ひよこ
0.1 + 0.2 が0.3にならないって本当なの?
ペンギン先生 ペンギン先生
JavaScriptのNumberなど、2進浮動小数点を使う計算では0.30000000000000004になる例があるよ。数学としての足し算が変わるのではなく、保存する値や計算結果を有限の精度に近似するためなんだ。
ひよこ ひよこ
どうして0.1でズレが出るの?
ペンギン先生 ペンギン先生
10進数の0.1は、2進数では0.0001100110011…と無限に続く。有限のビット数では全部を保存できないので、表せる近い値へ丸めるんだ。0.5のように2進数でも有限桁で表せる小数もあるよ。
ひよこ ひよこ
四捨五入の誤差だけを指すの?
ペンギン先生 ペンギン先生
丸め方には切り捨てや、最も近い値を選ぶ方法などがあるよ。また2進数だけの問題でもない。10進の型でも1÷3などは有限桁に収まらず、決めた精度で丸める必要がある。計算の途中で誤差が重なることもあるんだ。
ひよこ ひよこ
対策すれば誤差は全部なくなる?
ペンギン先生 ペンギン先生
扱う数と用途によるよ。一定の単位で表せる金額なら最小単位の整数を使う方法があるし、10進の値を扱うDecimalなどの型もある。ただし割り算や精度の制限では丸めが必要。元の値の渡し方、精度、丸め規則もそろえるんだ。
ひよこ ひよこ
値を比較するときはどうするの?
ペンギン先生 ペンギン先生
近似値の比較では、用途に合う許容差を使うよ。絶対的な差だけでなく、値の大きさに応じた相対的な差を考える方法もある。Pythonのmath.isclose()は両方を指定できる。整数や正確に一致すべき値まで、一律に近似比較へ変える必要はないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「丸め誤差」って出てきたら「コンピュータの小数計算で生じるズレ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Rounding Error」 = 丸めによる誤差
💬 Roundは、決めた精度に数値を丸めること。四捨五入だけでなく、切り捨てなどの丸め方もあるよ。

参考資料

← 用語集にもどる