背景
「消費税の計算方法を切捨てで統一してください!」と頼まれて、「はい、お安い御用!今は切上になってるんならその反対にすればいいんだよね。」とチャチャッと修正して動作確認。
なんか変な数字が、税込金額が7,270円で、消費税率が10%の時に税抜金額が6610円で税額が610円になっている。なぜ???
結論
以下の会計士さんのブログにも記載されていますが、税込金額からの逆算だと丸め方法は統一できません。
税率によって違うのですが、10%の場合だと、たとえば税込7,270円から逆算して税額、税抜を求めると税額は「切上」にするしかありません。(下表の例3、それ以外は全てNG)
# | 税抜 | 税額 | 合計 | 税込金額 は正しい? |
税額 は正しい? |
税率の 丸め方法 |
---|---|---|---|---|---|---|
例1 | 6610 | 661 | 7271 | NO | YES | ー |
例2 | 6610 | 660 | 7270 | YES | NO | ー |
例3 | 6609 | 661 | 7270 | YES | YES | 切上 |
例4 | 6609 | 660 | 7269 | NO | YES | 切捨 |
税込金額から税額を算出するアルゴリズム(できる限り切捨てる版)
/**
* 消費税計算(税込料金から税抜料金と税額を算出する)
* taxIncludePrice 税込料金
* taxRate 税率(10%なら10)
*/
function calc( taxIncludedPrice , taxRate ) {
// 税額計算(切捨て)
var tax = Math.floor(taxIncludedPrice * taxRate / (100 + taxRate));
var taxExcludedPrice = taxIncludedPrice - tax;
// 税額が正しいか検証(税抜から税額を求める)
var tax_for_check = Math.floor(taxExcludedPrice * taxRate / 100);
// 不一致なら補正(切上)
if(tax_for_check > tax){
taxExcludedPrice--;
tax++;
}
}
消費税10%の場合の規則性
テストしたら面白いことがわかりました。
切上が必要になるのは、10円 + (11円 x n)
でした。(nは整数)
逆に言うと、税込金額から10円を引いて11で割り切れる場合は、切上が必要です。