DESIGN / CODE / INFRA / AI

解説

AIの合計が少し違う?各行の丸めと、合計後の丸めを分けて検算しよう

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

AIの合計が少し違う?各行の丸めと、合計後の丸めを分けて検算しよう
保存リストを見る →
この記事の道しるべ 4項目

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

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

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