round() 関数は、Pythonで数値を四捨五入するための組み込み関数ですが、内部の動きは単純な「四捨五入」ではなく、銀行丸め(Banker's rounding) と呼ばれる少し特別なルールを使っています。
基本的な仕組み
-
引数がひとつの場合(
round(x))- 小数第1位を基準に丸める(整数にする)。
- 0.5 の場合は「偶数に丸める」。
>>> round(3.5) 4 # 偶数に丸める >>> round(4.5) 4 # 偶数に丸める(普通の四捨五入だと5になりそうだが…) >>> round(3.6) 4 >>> round(3.4) 3この「0.5を常に偶数に丸める」ルールが Banker's rounding(偶数丸め) です。
こうすると、統計計算や大量データ処理で丸め誤差が偏りにくくなります。 -
引数がふたつの場合(
round(x, ndigits))-
ndigitsの桁数に丸める。 -
ndigits=0なら整数、ndigits=2なら小数第2位まで。 - 0.5 の場合はやはり偶数丸め。
>>> round(2.675, 2) 2.67 # 浮動小数点の影響で一見変な結果に見える >>> round(2.685, 2) 2.68ここで「おや?」と思うのは、浮動小数点誤差の影響です。
2.675は内部では厳密に2.675ではなく、2.674999999... と表現されるため、結果が少しずれることがあります。 -
実装イメージ(概念)
- 値を10^n倍する(丸めたい桁数に合わせる)
- 0.5 の場合は偶数に丸める
- 10^n で割り戻す
まとめ
-
round()は「四捨五入」ではなく「偶数丸め(Banker's rounding)」 - 大量のデータを丸めるときに偏りが減るのがメリット
- 浮動小数点の誤差で直感と違う結果が出ることもある