同じ注文なのに、なぜ金額が合わないのか — 商品ごとに割引・端数処理した場合と、注文全体で割引・端数処理した場合の計算比較
会員システムを使う人の、大人の算数・国語・論理的思考

この特別編では、会員システムの仕事で出会う「なぜだろう」を、大人の算数・国語・論理的思考の三つの視点から一つずつひも解きます。第1部は「お金を扱う大人の算数」。その第1回は、もっとも身近な「金額が合わない」という疑問からはじめます。

今回のテーマ

「15%引き」と決めただけで、金額は一つに決まるのか。同じ注文が、なぜ違う金額になるのか。

要点先に、この回の要点

同じ「15%引き」でも、円未満をどの単位(商品ごと/明細ごと/注文全体)で丸めるかで、最終金額は変わります。どちらかがバグなのではなく、「丸めのルールを決めていない」ことが原因です。

  • 1個ずつ丸めてから合計した額と、合計してから丸めた額は、一致するとは限らない(端数を捨てる回数が違う)。
  • 「15%割引」だけでは仕様が足りない。丸める単位と丸め方まで決めて初めて、答えが一つになる。
  • 会員・決済システムでは、「誰が決め・どの単位で丸め・何を記録するか」を仕様として明示する。

同じ商品を、同じ数だけ、同じ割引率で売る。それなら、誰が計算しても同じ金額になるように思えます。ところが、システムでは、同じ注文なのに金額が合わないことがあります。原因は、難しい計算ではありません。どこで小数点以下を捨てたか。それだけです。

100円の商品を3個、15%引きにする

税込100円の商品を3個購入し、15%割引にするとします。二通りの計算のしかたを、並べてみましょう。

A 85%にしてから、3個分にする
×85%割引 → 丸め切り捨て → ×3個数
100円 × 85% = 85円
85円 × 3個 = 255円
合計255円
B 3個分にしてから、85%にする
×3個数 → ×85%割引 → 丸め切り捨て
100円 × 3個 = 300円
300円 × 85% = 255円
合計255円

どちらも255円です。この例だけを見ると、単価に割引を掛けても、合計に割引を掛けても同じように見えます。

ぱっと見ではわからないかもしれません。理由はシンプルで、100円 × 85% = 85円と、割引後がちょうど整数になり、切り捨てる端数(小数点以下)がそもそも生まれないからです。捨てるものがなければ、どこで捨てても結果は変わりません。差が出るのは、割引後に「84.15円」のような端数が生まれてからです。次に、その端数が出る例を見てみます。

99円の商品に変えてみる

今度は、税込99円の商品を3個、15%引きにします。

A 85%にしてから、3個分にする
×85%割引 → 丸め切り捨て → ×3個数
99円 × 85% = 84.15円
→ 円未満を切り捨てて 84円
84円 × 3個 = 252円
合計252円
B 3個分にしてから、85%にする
×3個数 → ×85%割引 → 丸め切り捨て
99円 × 3個 = 297円
297円 × 85% = 252.45円
→ 円未満を切り捨てて 252円
合計252円

この例でも、金額は合いました。では、数量を10個に増やしてみます。

A 85%にしてから、10個分にする
×85%割引 → 丸め切り捨て → ×10個数
99円 × 85% = 84.15円 → 84円(切り捨て後)
84円 × 10個 = 840円
合計840円
B 10個分にしてから、85%にする
×10個数 → ×85%割引 → 丸め切り捨て
99円 × 10個 = 990円
990円 × 85% = 841.5円
→ 円未満を切り捨てて 841円
合計841円
同じ注文・同じ15%引き・数量10個
A ・ 1個ずつ計算した場合840円
B ・ 合計してから計算した場合841円
差 = 1円 同じ商品。同じ数量。同じ割引。それでも、1円違う。

違うのは、掛け算の順番ではありません

違うのは、どこで円未満を切り捨てたかです。1個ずつ計算する方法では、商品1個ごとに0.15円を捨てています。10個なら、端数を10回捨てることになります。一方、合計してから計算する方法では、最後に一度だけ端数を捨てます。

1個ずつ丸めてから足した金額と、
全部を足してから丸めた金額は、同じになるとは限らない。

実際に、あなたの数字で試せます。数量を増やすと、差がどう育つか——

「15%割引」だけでは、まだ足りません

お客様から、「この商品を15%割引にしてください」と言われたとします。一見、十分な指示に見えます。しかし、システムを作るには、もう一つ決める必要があります。

「15%」の先に、決めておくこと
  • 1個ずつ割り引くのか
  • 数量を掛けた合計から割り引くのか
  • 円未満は切り捨てるのか
  • 四捨五入するのか

ここが決まっていなければ、答えは一つになりません。どちらかがバグというわけではありません。計算のルールが違うだけです。

誰が決め、何が計算され、何を残すのか

同じ「15%引き」でも、どの単位で丸めるかで金額は変わります。ここでは商品単位・明細単位・注文単位の違いに集中し、判断・計算・記録に分けて整理します。

人が決めること
  • 丸める単位(商品・明細・注文)
  • 集計前か、集計後か
  • 表示金額と内部計算値の関係
システムが計算すること
  • 各単位での割引額を求める
  • 明細合計を求める
  • 注文合計を求める
記録として残すこと
  • 丸め前金額
  • 確定単価
  • 明細金額
  • 注文合計
丸める単位を、仕様書の言葉にすると

15%引きにして、合計を出す。

割引後価格は商品1点単位で確定し、確定後の単価へ数量を乗じる。注文合計に対して割引額を再計算しない。

商品ごとに丸めるか、注文全体で丸めるか——どちらか一方が常に正しいわけではありません。重要なのは、どの単位で丸めるかを決め、同じ注文なら誰が計算しても同じ金額を再現できることです。

現場では、こうなる

カートの合計と、明細を足した金額が1円違う。お客様から「計算が間違っている」と問い合わせが入る。

今回、覚えておきたいこと
設計の第1段 / 12 ・ 計算単位を決める
どこで丸めるかによって、最終金額は変わる。

割引率だけ決めても、計算方法は完成しません。何に割引を掛けるのか。どの段階で端数を処理するのか。そこまで決めて、初めて一つの金額になります。小さな1円の差に見えても、その後ろには、まだ決められていない計算ルールが隠れていることがあります。

Series ・ 特別編 大人の算数・国語・論理的思考 ― 連載一覧へ

よくあるご質問(FAQ)

Qなぜ同じ割引率なのに金額が合わないのですか?
A

円未満の端数をどの単位で丸めるかが違うからです。商品ごとに丸めると端数を何度も捨て、注文全体で丸めると一度だけになります。どちらも計算としては正しく、ルールの違いです。

Qどの単位で丸めるのが正解ですか?
A

常に正しい単一の正解はありません。商材・会計・表示の要件によって適切な単位は変わります。大切なのは、単位を決めて一貫させ、仕様として記録しておくことです。

Q少額な端数なので、無視してもよいのでは?
A

1件は数円でも、件数と期間で積み上がり、会計の突合や返金計算で合わなくなります。最初に丸めの仕様を決めておくのが安全です。

第1部 ・ 大人の算数 これが最初の回です。 連載のはじまり 次回 ── 第2回 1円未満は、どう処理するのか 次の回を読む
岸本 健志
会員ビジネスLab 主任研究員 / ハートランドITイノベーション代表

1997年よりインターネット業界に従事。2007年の創業以来、EC、メディア、SaaS、コミュニティサイトなど数多くの会員ビジネスの立ち上げと成長を支援。

30年近く会員システムの設計・運用に携わる中で、仕様は画面や機能だけでは完成せず、金額・言葉・条件という「基礎」をそろえて初めて一つに決まると考えるようになりました。この特別編では、その基礎を大人の算数・国語・論理的思考として整理しています。

「人との関係は設計できるのか」という問いに、これからも愚直に向き合い続けていきます。

← 大人の算数・国語・論理的思考 連載一覧へ