1. ホーム
  2. python

[解決済み] 浮動小数点数の四捨五入はどうすればよいですか?

2023-01-22 01:13:24

質問

の挙動がおかしいのですが。 round() 関数の奇妙な動作に直面しています。

for i in range(1, 15, 2):
    n = i / 2
    print(n, "=>", round(n))

このコードは印刷されます。

0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4
4.5 => 4
5.5 => 6
6.5 => 6

浮動小数点以下の数値は必ず切り上げられると思っていましたが、そうではなく、偶数番目に近い数値に丸められます。

なぜそのような動作になるのでしょうか、また、正しい結果を得るための最善の方法は何でしょうか。

私は fractions を使ってみましたが、結果は同じです。

どのように解決するのですか?

この 数値の種類 セクション は、この動作を明示的に文書化します。

round(x[, n])

x をn桁に丸め、半分を偶数に丸めます。nが省略された場合、デフォルトは0になります。

注意点として 半分を偶数に丸める . これはまた 銀行員丸め 常に四捨五入する(丸め誤差が大きくなる)のではなく、四捨五入することによって、最も近い であっても に丸めることで、丸め誤差を平均化することができます。

丸めの挙動をより細かく制御する必要がある場合は decimal モジュール を正確に指定することができます。 の丸め方を指定できます。 .

例えば、半分から切り上げる場合。

>>> from decimal import localcontext, Decimal, ROUND_HALF_UP
>>> with localcontext() as ctx:
...     ctx.rounding = ROUND_HALF_UP
...     for i in range(1, 15, 2):
...         n = Decimal(i) / 2
...         print(n, '=>', n.to_integral_value())
...
0.5 => 1
1.5 => 2
2.5 => 3
3.5 => 4
4.5 => 5
5.5 => 6
6.5 => 7