解説
AIの合計が少し違う?各行の丸めと、合計後の丸めを分けて検算しよう
AIに金額の合計を頼んだとき、電卓と少しだけ結果が違う。そんなときは、計算そのものだけでなく、**どこで小数を丸めたか**を確認してみよう。

AIに金額の合計を頼んだとき、電卓と少しだけ結果が違う。そんなときは、計算そのものだけでなく、どこで小数を丸めたかを確認してみよう。
ここでは架空の小数を使い、各行を丸めてから足す場合と、合計後に丸める場合を比較する。実際の請求書の税計算ルールを決める記事ではないよ。
同じ数でも、丸める順序で変わる
0.335が3行あるとして、小数第2位まで四捨五入する例を考えよう。
| 手順 | 計算 | 結果 |
|---|---|---|
| 各行で丸めてから合計 | 0.34 + 0.34 + 0.34 | 1.02 |
| 合計してから丸める | 0.335 × 3 = 1.005を丸める | 1.01 |
どちらも、決めた手順に従う計算として成立する。「小数第2位まで」とだけ頼むと、この手順が抜けてしまうんだ。
AIへ伝える条件を増やそう
依頼文には、対象行、単位、丸める桁、丸め方、丸める段階を添える。
架空の数値0.335、0.335、0.335を合計してください。
10進数として計算し、各行は丸めないでください。
合計後に小数第2位へ四捨五入(ROUND_HALF_UP)します。
丸める前の合計と、丸めた後の値を分けて示してください。
これは依頼文の例で、特定のAIが必ず同じように計算する保証ではない。出力された結果は別の計算手段で確かめるよ。
Decimalで手順を固定して検算
Pythonがある手元の作業環境なら、次の小さな例で確認できる。外部通信やファイルの書き換えはしない。
from decimal import Decimal, ROUND_HALF_UP
values = [Decimal('0.335')] * 3
unit = Decimal('0.01')
per_row = sum(v.quantize(unit, rounding=ROUND_HALF_UP) for v in values)
after_sum = sum(values).quantize(unit, rounding=ROUND_HALF_UP)
print(per_row, after_sum)
結果は1.02 1.01。編集部でもこの出力を確認したよ。文字列からDecimalを作るのは、例の10進小数をそのまま表すため。Python公式資料で、丸め方式やquantizeの仕様を確認できる。
Python標準のroundと、この例で指定したROUND_HALF_UPを同じものとして扱わないでね。境界の値では丸め方の違いも結果へ影響する。
実務では、正しい規則を先に決める
請求・会計・税務などでは、契約や制度、組織の規則で計算単位や端数処理が決まる場合がある。AIへ都合のよい値を出させる前に、採用すべき規則を確認しよう。
CSVの対象行と合計の照合に加えて、「どの段階で丸めるか」を記録すると、差の理由を追いやすくなるよ。

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