
消費税の小数点以下の端数処理
日本国内で買い物をすると、消費税が加算された「税込価格」が請求されます。
このとき必ず問題になるのが、消費税計算で発生する小数点以下の端数をどう扱うかという点です。
実は、消費税法では端数処理の方法は1つに定められていません。
そのため、店舗や事業者ごとに異なる処理が行われており、同じ税抜価格でも最終的な請求金額が変わることがあります。
消費税の端数処理は3パターンある
消費税の端数処理には、次の3つの方法があります。
1. 切り捨て
「切り捨て」は店舗や事業者で一番多い端数処理です。
「切り捨て」が一番多い理由は、国税通則法などでは算出された税額の1円未満は「切り捨て」にすることが定められているからです。
単純に小数点以下を切り捨てて計算に含めないだけなので処理がシンプルです。
| 税抜価格 | 9,999円 |
| 消費税(10%) | 999.9円 |
| 切り捨て前の税込価格 | 10,998.9円 |
| 切り捨て後の税込価格 | 10,998円 |
JavaScriptの場合はMath.trunc()を使用して次のようになります。
const price = 9999
const taxRate = 110
const taxRateDiv = 100
const result = Math.trunc(price * taxRate / taxRateDiv)
console.log(result) // 10998ちなみにMath.floor()は「切り捨て」ではなく「切り下げ」のため、負数だと整数部分が変わってしまうので使わないでください。
console.log(Math.floor(-999.9)) // -10002. 四捨五入
小数点以下の値によって「切り上げ」か「切り下げ」が決まり、処理結果が変わります。
| 税抜価格 | 9,999円 |
| 消費税(10%) | 999.9円 |
| 四捨五入前の税込価格 | 10,998.9円 |
| 四捨五入後の税込価格 | 10,999円 |
JavaScriptの場合はMath.round()を使用して次のようになります。
const price = 9999
const taxRate = 110
const taxRateDiv = 100
const result = Math.round(price * taxRate / taxRateDiv)
console.log(result) // 10999ChatGPTなどの一部の生成AIでは税込価格の計算に四捨五入(Math.round())が使用されることがあるので、税込価格を計算するコードを生成する際には注意が必要です。
3. 切り上げ
小数第一位が1以上であれば常に切り上げるため、例えば「100.1」なら「101」になります。
| 税抜価格 | 9,991円 |
| 消費税(10%) | 999.1円 |
| 切り上げ前の税込価格 | 10,990.1円 |
| 切り上げ後の税込価格 | 10,991円 |
消費者から本来よりも多く請求してしまうことが多くなってしまうので、切り上げで端数処理しているケースは稀です。
JavaScriptの場合はMath.ceil()を使用して次のようになります。
const price = 9991
const taxRate = 110
const taxRateDiv = 100
const result = Math.ceil(price * taxRate / taxRateDiv)
console.log(result) // 10991まとめ
消費税の計算では小数点以下の端数処理が必ず発生しますが、その処理方法は法律で一律に定められているわけではありません。
切り捨て・四捨五入・切り上げのいずれを採用するかは、店舗や事業者ごとの判断に委ねられているので、税込価格の計算処理などが発生するECサイトなどを制作する際は事前に必ずヒアリングしてから制作する必要があります。
JavaScriptなどで税込価格を計算する際は、どの端数処理を前提としているのかを明確にしたうえで、適切な関数を選択することが重要です。
実装時の端数処理の違いが、金額のズレやトラブルにつながる可能性があることを理解しておきましょう。


