消費税の端数処理をシステムでどう作るか:1請求書1回と、明細との差額
確認日 2026-10-31(調べ方)・制度は変わることがあります。個別の判断は公式の資料と専門家に確かめてください。
インボイス(適格請求書)に書く消費税額は、1枚につき税率ごとに1回だけ端数処理します。切上げ、切捨て、四捨五入のどれを使うかは自由です。ただし、明細ごとに計算して端数処理した税額の合計を、そのまま記載することはできません。
システムで起きる問題は、明細の税額の合計と請求書の税額が合わないことです。設計の答えは、税率別の集計を請求書の中心に置き、明細の税額はそこから配る値として扱うことです。税額を計算する場所を1か所に決め、あとの工程では計算し直しません。
決まりの中身
消費税法施行令第70条の10は、適格請求書に記載する税額の計算を2通り定めています。税抜価額の税率別合計に10%(軽減は8%)を掛ける方法と、税込価額の税率別合計に110分の10(軽減は108分の8)を掛ける方法です。
国税庁のインボイスQ&Aの問57は、端数処理について次の3点を示しています。
- 1枚の適格請求書につき税率ごとに1回行う
- 端数処理の方法(切上げ、切捨て、四捨五入など)は任意
- 個々の商品ごとに計算して端数処理し、その合計を税額として書くことは認められない
計算で見ると差が分かります。税率10%の3明細の請求書です。
| 明細 | 税抜 | 10% | 明細ごとに切捨て |
|---|---|---|---|
| 商品A | 198 | 19.8 | 19 |
| 商品B | 298 | 29.8 | 29 |
| 商品C | 398 | 39.8 | 39 |
| 合計 | 894 | 89.4 | 87(明細の合計) |
| 合計から1回で切捨て | 894 | 89.4 | 89 |
2円の差が出ました。正しい記載事項の税額は89円です。明細の数が多いほど差は大きくなります。
請求書のテーブル設計
税率別の合計を、請求書の行とは別のテーブルで持ちます。これが記載事項の税額の本体です。
請求書と税率別の集計
invoices
- id PK
- customer_id FK
- issue_date
- rounding_mode
- tax_basis
invoice_lines
- id PK
- invoice_id FK
- description
- tax_rate_code
- amount
invoice_tax_summaries
- invoice_id FK
- tax_rate_code
- taxable_amount
- tax_amount
- invoices 1 — N invoice_lines
- invoices 1 — N invoice_tax_summaries
税率別の合計で計上する
| 借方 | 金額 | 貸方 | 金額 |
|---|---|---|---|
| 売掛金 | 983 | 売上 | 894 |
| 仮受消費税 | 89 |
invoice_tax_summaries| invoice_id | tax_rate_code | taxable_amount | tax_amount |
|---|---|---|---|
| INV-1 | 10% | 894 | 89 |
計算は発行の確定時に1回だけ行い、結果を保存します。あとの工程(PDF、仕訳、連携)は保存した値を読みます。マスタの端数処理の方法があとで変わっても、発行済みの請求書の金額は変わりません。
複数税率の例は、Q&Aの問57に載っています。税込価額から計算する形で、10%対象60,000円は5,454円、8%対象40,000円は2,962円、合計8,416円です。
invoice_tax_summaries| invoice_id | tax_rate_code | taxable_amount | tax_amount |
|---|---|---|---|
| INV-2 | 10% | 60,000 | 5,454 |
| INV-2 | 8% | 40,000 | 2,962 |
tax_basis=gross の例。taxable_amount は税込合計。税率ごとに切捨て
計算は整数で行います。浮動小数点では、たとえば 220 * 1.1 が 242.00000000000003 になり、切上げで243になってしまいます。
from fractions import Fraction
# 税率は分数で持つ。税抜なら 10/100、税込なら 10/110
RATE = {
("10%", "net"): Fraction(10, 100), ("10%", "gross"): Fraction(10, 110),
("8%", "net"): Fraction(8, 100), ("8%", "gross"): Fraction(8, 108),
}
def tax_amount(total: int, rate: str, basis: str, mode: str) -> int:
"""税率別の合計 total から、記載事項の税額を1回だけ計算する"""
x = total * RATE[(rate, basis)]
floor = x.numerator // x.denominator
if mode == "floor" or x == floor:
return floor
if mode == "ceil":
return floor + 1
if mode == "half_up":
return floor + 1 if x - floor >= Fraction(1, 2) else floor
raise ValueError(mode)
print(tax_amount(60000, "10%", "gross", "floor")) # 5454
print(tax_amount(40000, "8%", "gross", "floor")) # 2962
金額が負になる値引きや返品を同じ関数に通すときは、切捨ての向きに注意します。マイナスは絶対値で計算してから符号を戻す、といった決まりを経理と決めます。
明細の税額とのずれをどう扱うか
明細ごとの税額が欲しい場面はあります。社内の商品別の分析、部分返品のときの計算などです。ただし、法令上の記載事項の税額は、税率別の合計から計算したものです。問66は、契約ごとに算出した税額を参考に載せるのは問題ないが、記載事項の税額にはならないとしています。
設計の例として、明細の税額を「配った値」として持つ方法があります。明細ごとに切り捨てたあと、合計の税額に足りない分を金額の大きい行から1円ずつ足します。
invoice_lines| line | amount | 計算上の税額 | 切捨て | 調整 | 配った税額 |
|---|---|---|---|---|---|
| A | 198 | 19.8 | 19 | 0 | 19 |
| B | 298 | 29.8 | 29 | 1 | 30 |
| C | 398 | 39.8 | 39 | 1 | 40 |
合計の税額89円に対して切捨ての合計は87円。差の2円を金額の大きい行から配る例。配った税額の合計は89円
配る順番に法令の決まりはありません。社内で決めて固定します。請求書の画面や PDF に明細の税額を出すかは別の判断です。取引先の検算の混乱を避けるなら、明細は税抜金額だけ、税額は税率別の合計だけを出す作りが単純です。
受け取る側のシステムでは、請求書の税額を計算し直さず、記載された値を入力する作りが基本です。仕入税額の請求書等積上げは、請求書に記載された税額を使う計算だからです(問126)。
納品書と月まとめの請求
BtoB では、納品のたびに納品書を出し、月末に請求書を出す形がよくあります。このとき端数処理の単位は、税額をどの書類に書くかで決まります。
| 方式 | 税額を書く書類 | 端数処理の単位 | 根拠 |
|---|---|---|---|
| 請求書で要件を満たす | 請求書 | 請求書の税率ごとに1回 | Q&A 問57 |
| 納品書に税額、請求書に登録番号 | 納品書 | 納品書の税率ごとに1回 | Q&A 問67 |
| 契約ごとの内訳つきの請求書 | 請求書 | 請求書の税率ごとに1回。契約ごとの税額は参考 | Q&A 問66 |
複数の書類で要件を満たすには、書類の関連が明確である必要があります。問67は、請求書に納品書番号を書く方法を例に挙げています。システムでは、請求の行が納品書を参照する列を持ちます。
納品書単位の方式は、すでに納品書で税額を計算している場合に変更が小さくて済みます。一方で、請求書の税額の合計は「納品書の税額の和」になるので、請求書だけを見て検算すると合わないことがあります。
値引き・返品と計算の順番
請求全体からの値引きは、処理の順番で税額が変わります。問70は、端数の値引き(出精値引き)について、すでに行った取引への値引きなら対価の返還等として処理し、これから行う取引なら対価から直接減額するとしています。時期の区分が難しいときは、どちらの処理でもよいとしています。
システムでは次の点を確認します。
- 値引きの行に税率区分を持たせる。複数税率の請求全体への値引きは、税率ごとの按分が要る場合がある
- 請求の金額を減額するのか、返還として別に扱うのかを、値引きの種類ごとに決める
- 返品や値引きで適格返還請求書を出す場合の記載は、返還インボイスの記事を見る
納税額の計算:割戻しと積上げ
請求書の端数処理と、会社が納める消費税の計算は別の話です。ただし、ここにも請求書の税額が関わります。問118と問119の内容を表にします。
| 区分 | 方法 | 計算 | 条件 |
|---|---|---|---|
| 売上税額 | 割戻し(原則) | 税率別の税込合計から課税標準を求め、税率を掛ける | なし |
| 売上税額 | 積上げ(特例) | 適格請求書の税額の合計×78/100 | 交付した適格請求書の写しを保存 |
| 仕入税額 | 請求書等積上げ(原則) | 受け取った請求書の税額の合計×78/100 | 適格請求書などの保存 |
| 仕入税額 | 帳簿積上げ | 仮払消費税の合計×78/100 | 課税仕入れの都度に帳簿へ計上 |
| 仕入税額 | 割戻し(特例) | 税率別の税込合計から計算 | 売上を割戻しで計算している場合に限る |
システムで効く点は3つあります。
- 売上で積上げを使うと(取引先ごとの併用を含む)、仕入は割戻しを使えません(問119)
- 積上げで使うのは適格請求書に書いた税額です。写しや電磁的記録を消さないようにします
- 帳簿積上げの仮払消費税の端数処理は、切捨てまたは四捨五入です(問126)。請求書の税額のような「切上げも可」とは違います
どの計算にするかは経理と税理士の判断です。システムは、請求書単位の税額と、税率別の税込合計の両方を出せるようにしておきます。仕訳連携で税額を集約するときも、請求書で確定した値を合計し、計算し直しません。
判断の練習
よくある質問
- 消費税の端数処理は切り捨てと決まっていますか?
- 決まっていません。適格請求書の消費税額等の端数処理は、切上げ、切捨て、四捨五入のどれでもかまいません。ただし方法を問わず、1枚の適格請求書につき税率ごとに1回です。
- 明細ごとに消費税を計算して合計してはいけませんか?
- 適格請求書の消費税額等としては認められません。国税庁のQ&Aは、個々の商品ごとに計算して端数処理した合計を記載することはできないとしています。
- インボイス導入後、明細の行に消費税を表示できますか?
- Q&Aの問66は、契約ごとの税額を参考として載せるのは問題ないが、記載事項の税額にはならないとしています。明細の税額を表示するなら参考の値と考え、記載事項の税額は税率別の合計から別に計算します。
- 月まとめの請求書で、納品書ごとに端数処理してもよいですか?
- 納品書に税率別の合計と税額を書いて請求書と合わせて適格請求書にするなら、納品書ごとに税率別1回の端数処理になります。請求書に税額を書くなら、請求書で1回です。
- 売上の消費税は請求書の税額を足せばよいですか?
- 原則は課税期間の税込合計から割り戻す計算です。適格請求書の写しを保存していれば、請求書の税額を積み上げる特例も使えます。ただし仕入税額の計算方法に制約が出ます。
出典