解説
2.5を丸めると2?AIへ頼む前にHALF_EVENとHALF_UPをそろえよう
0.5ちょうどの扱いは丸め方式で変わる。正負の小さな数をDecimalで比較し、丸める桁・方法・段階を明示して検算する入門記事。

2.5を整数へ丸めたら2になった。四捨五入なら3ではないのかな。ちょうど中間の値をどちらへ寄せるかは、採用した丸め方式によって違うよ。
今回は架空の小さい数だけを使う。Pythonの例を実行しなくても、表から二つの方式の違いを確認できるよ。実際の請求や税の規則を決める記事ではない。
HALF_EVENは、中間なら偶数の側
ROUND_HALF_EVENは近い側へ丸め、ちょうど中間なら偶数になる側を選ぶ。2.5なら2、3.5なら4になる。
「いつでも小さい方」へ切り捨てる方式ではないんだ。3.5では4になることも合わせて見よう。
HALF_UPは、中間なら0から離れる側
ROUND_HALF_UPも近い側へ丸め、中間の場合は0から離れる側を選ぶ。2.5なら3、-2.5なら-3になるよ。
名前のUPだけを見て、数直線でいつも正の方向へ動くと覚えないようにしよう。負の数を一つ含めて確認すると、違いを読みやすいね。
| 元の数 | HALF_EVEN | HALF_UP |
|---|---|---|
| 2.5 | 2 | 3 |
| 3.5 | 4 | 4 |
| -2.5 | -2 | -3 |
| -3.5 | -4 | -4 |
Decimalで方式を明示して比べる
from decimal import Decimal, ROUND_HALF_EVEN, ROUND_HALF_UP
for text in ["2.5", "3.5", "-2.5", "-3.5"]:
value = Decimal(text)
even = value.quantize(Decimal("1"), rounding=ROUND_HALF_EVEN)
up = value.quantize(Decimal("1"), rounding=ROUND_HALF_UP)
print(text, even, up)
出力は表の四行と対応する。Decimalへ文字列を渡し、今回の10進小数をそのまま扱っているよ。先に二進浮動小数へ変換した値から作る場合とは、入力の条件が違う。
桁と方式と、丸める段階を分ける
丸め方式だけ決めても、どこまで残すかが必要。整数へするのか、小数第2位までにするのかを明示しよう。
さらに、各行を丸めてから足すのか、合計したあとに丸めるのかでも結果は変わり得る。この三つを「四捨五入で」という一語へまとめないほうが、照合しやすいね。
AIへの依頼で、比較する条件を残す
以下の架空の値を10進小数として扱ってください。
整数へROUND_HALF_EVENで丸めます。
元の値と丸めた値を表にし、ちょうど中間となる値と負の値も含めてください。
計算結果は別のプログラムで照合します。
これは条件を揃えるための例。AIが方式名を書いたからといって、結果まで必ず合うとは限らない。元の値と決めた方式を使い、独立した計算で確かめよう。
実務の方式は、正式なルールを先に確認する
会計、請求、計測などでは、制度や契約、システムの仕様に従って方式が決まる場合がある。都合のよい合計が出る方式を、あとから選ばないようにしたいね。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。