DESIGN / CODE / INFRA / AI

解説

2.5を丸めると2?AIへ頼む前にHALF_EVENとHALF_UPをそろえよう

0.5ちょうどの扱いは丸め方式で変わる。正負の小さな数をDecimalで比較し、丸める桁・方法・段階を明示して検算する入門記事。

2.5を丸めると2?AIへ頼む前にHALF_EVENとHALF_UPをそろえよう
保存リストを見る →
この記事の道しるべ 6項目

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が方式名を書いたからといって、結果まで必ず合うとは限らない。元の値と決めた方式を使い、独立した計算で確かめよう。

実務の方式は、正式なルールを先に確認する

会計、請求、計測などでは、制度や契約、システムの仕様に従って方式が決まる場合がある。都合のよい合計が出る方式を、あとから選ばないようにしたいね。

編集部ではPython 3.12で四つの値と二方式を確認した。AIモデルの計算精度や、特定の業務への適法性を検証した結果ではないよ。段階の違いは丸める前後の合計、比較の範囲は数値の許容誤差も参考になるね。

参考・出典

公開と変更の記録
  • :初回公開

日時は日本時間です。記載のある変更は、確認できた編集記録に基づきます。更新日の違いだけから変更内容を推測して載せることはありません。

更新・訂正の方針 →

みんなのコメント 0

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。