社会保険料、1円のズレはなぜ起こる 其の②
前回述べたように、雇用保険を含めた広義の『社会保険料』の本人負担分は『五捨五超入』が原則だ。
残念ながら『五捨五超入』を直接求めるExcel関数はないので、普通に考えられる五捨五超入のExcel式としては、こんな感じかと思う。
① ROUND(『数値』ー 0.00001,0)
② CEILING(『数値』ー 0.5,1)
③ ABS(INT(0.5 ー 『数値』))
④ 標準報酬 * 料率 ー ROUND( 標準報酬 * 料率 /2)
ここで①~③の『数値』とは、狭義の社会保険料なら
標準報酬や標準賞与額 × 保険料率 ÷ 2
雇用保険料なら
総支給金額 × 保険料率
をいう。
ここでは保険料を前提として『円』付きで説明するが、①~③は『五捨五超入』したいときに一般的に使える方法でもある。
① ROUND(『数値』ー 0.00001,0)
これは式をご覧になれば分かる通り、数学的には全然『五捨五超入』ではない。
『….5円』を、力づくで強引に『0.49999円』にして切捨てさせるものだが、引く数(ここでは『0.00001』)をよく吟味し、『….5』よりほんの少し大きい数が巻き込まれて切捨てられることがないように注意すれば有効な方法だ。
ここで引く数『0.00001』を小さくすればするほど数学的には『五捨五超入』に近づくが、現実には小さくし過ぎるとExcelの内部演算の可能ケタ数を超えて機能しなくなるので、必要十分な値にすることが重要だ。
保険料の場合なら雇用保険料が現在1000分の○.○なので『0.00001』位にしておくのが良い。泥臭い方法だが一番間違いが少ない気がするし、他の人が見ても何をやりたいのか分かりやすい。何より安心感がある。
② CEILING(『数値』ー 0.5,1)
これはExcelの『指定値の倍数に切上げる』関数を使うものだ。たとえば『…3.5』から0.5引けば『…3』になり、指定値『1』の倍数に切上げても『…3』。『…3.50…01』から0.5引けば必ず『…3.00…01』になるので切上げると『…4』になる。
ということで数学的にはカンペキな『五捨五超入』の完成だ。しかもスマートだ。ただし個人的見解になるが、筆者は『CEILING』の内部演算をそれほど信用していないので、あまり使ったことはない。
③ ABS(INT(0.5 ー『数値』))
③はちょっと特殊だが考え方としては面白い。まず円未満『四捨五入』というものを『0.5足してから小数点以下を切捨てる』ことだと考える。
そもそも四捨五入と五捨五超入の違いは『0.5』の処遇?だけで、それ以外は全く同じだ。
ここでIFを使って『端数=0.5』のときだけ切捨て、他は四捨五入するという手も考えられるが、これはどう考えてもツギハギだらけでスマートでなさすぎる。
スマートでないどころか、こういった数値の条件式中で『=』を使うのはExcel内部の演算精度を考えると非常に危険なのだ。
・ 数直線自体を逆にすれば…
ここで発想を転換して、無限の下方から無限の上方に至る数直線自体を天地逆にしてやればいいのではないかと考える。
つまり、いったん符号を逆にしてから0.5を足し、小数点以下を切捨て、これの絶対値を取れば五捨五超入の出来上がりというわけだ(下図)。
+/- +0.5 INT ABS
321.499 ➡ -321.499 ➡ -320.999 ➡ -321 ➡ 321
321.500 ➡ -321.500 ➡ -321.000 ➡ -321 ➡ 321
321.501 ➡ -321.501 ➡ -321.001 ➡ -322 ➡ 322
・ ROUND = 四捨五入 ではない
それなら『ABS(ROUND(ー『数値』))』でも同じじゃないかと思うかもしれないがマイナスの場合、たとえば『ROUND(-3.5)』は『-4』になってしまうのでダメなのだ。-3.5を『四捨五入』すれば、答えは数学的には-3にならなければならない。
結局『ROUND=四捨五入』なのは、対象がプラスの場合だけなのだ。これは決してバグではなく、ROUNDが銀行業務でよく使われることと関係しているらしい。
会社の経理事務において千円単位で金額を表示することがある。ここで千円単位に『丸める』ときに、四捨五入に固執すると次のような問題が起きる。
○ 四捨五入ではマズい?
太郎が次郎に3,500円貸したとする。この取引で資産としては、太郎が+3,500円・次郎がー3,500円となり、千円単位に(正しく)四捨五入すれば太郎が+4千円・次郎がー3千円になる。
いくら数学的に正しくても、これでは合計が『+1千円』になって具合が悪い(無から有が生じたことになる?)し、太郎が「約4千円貸した」といって次郎が「約3千円借りた」と言ったら、太郎か次郎いずれかの性格によってはケンカになる。
だからExcelの『ROUND』では、丸める位の数が『5』の場合、絶対値が大きい方に丸められるようになっているのだ。
たとえばこの例で言えば下図の右側のようになる。次郎としては不満が残るかもしれないが、あくまで丸めた結果を表示しただけということで納得してもらうしかない。
1,000円未満四捨五入 ROUND(金額,-3)
太郎 4,000円 ☜ 3,500円 ☞ 4,000円
次郎 -3,000円 ☜ -3,500円 ☞ -4,000円
④ 標準報酬 * 料率 - ROUND( 標準報酬 * 料率 / 2)
これは保険料算出に特化した式だが、料額表の『全額』から、事業主負担分を引いて本人分を求めるものだ。事業主負担分は普通の四捨五入なので、これもあまり間違いは起こらないと思う。
社会保険料の支払い額も同時に求めるときはどうせ折半する前の金額も必要になるので、それを算出してから計算する場合ならムダもない。
介護保険料の計算は最後に
さて、健康保険料と介護保険料の算出には、もう1つ超えねばならないヤマがある。
『健康保険料』と言った場合(狭義の)『健康保険料』だけをいう場合と、健康保険料と介護保険料を合わせたものを指して言う場合がある。ここでは介護保険料を含まないものを『健保料』、介護保険料を含んだものを『健保+介保料』という。
ここで『料額表』には、健保料と、健保+介保料は明示されているが、介護保険料単独の金額は明示されていない。
この天下国家に明示されている保険料に、保険料率をもとに計算した保険料を一致させないと、色々と問題が起こることがある。
・ 健保料と介保料をそれぞれ求めると…
たとえば2025年度北海道の保険料率をとると、健保料率が10.31%、介保料率が1.59%(これは全国一律)となっている。ここで標準報酬15万円の方の本人負担分をそれぞれ求めようとすると、
健保料 15万円 × 10.31% ÷ 2 = 7,732.5円 ≒ 7,732円 … ①
介保料 15万円 × 1.59% ÷ 2 = 1,192.5円 ≒ 1,192円 … ②
で合計8,924円になり、料額表にある『8,925.0』円とは(当然のことながら)1円ズレる。これを、Excelで計算するときに修正するのは困難だ。
・ 健保料と『健保+介保料』から求めると…
あくまで基本の料率は健保料率の『10.31%』と健保+介保料率の『11.90%』と考えなければならない。こうすれば同じ標準報酬15万円の場合、
健保料 15万円 × 10.31% ÷ 2 = 7,732.5円 ≒ 7,732円
健保+介保料 15万円 × 11.90% ÷ 2 = 8,925.0円 = 8,925円…③
なので、介護保険料は差額の(8,925円ー7,732円)1,193円になる。
仮にここで②の介保料(1,192円)と③の健保+介保料(8,925円)から健保料を出すと7,733円になる。
40~64才の方のことだけ考えればそれでもよさそうだが、40才未満の方は介護保険料はかからないので、保険料額表にも折半額7732.5円と明示してある。端数処理すれば7,732円だ。
同額であるはずの(介保料を含まない)健保料が、40才未満が7,732円で40才以上が7,733円とバラバラになってしまう。これは具合が悪い。しかし丸めた数字同士を合算すれば、元の数を合算したものを丸めたものと異なってくるのは当たり前なのだ。
・ 『健保料』と『健保+介保料』から求めるのが最善
これを避けるには、給与の保険料の本人負担分は
① 標準報酬 × 健康保険料率 ÷ 2
を端数処理して健保料を確定
② 標準報酬 × (健保+介保料率) ÷ 2
を端数処理して健保+介保料を確定
③ 『健保+介保料』ー 健保料
で介保料を確定
の順序でやるのがいいだろう。こうすれば『同じ標準報酬なのに、40才以上と40才未満で健保料が1円違う!』という事態は起こらない。
実際にはここで『確定』した介護保険料は、標準報酬に介護保険料率をかけて2で割った金額を端数処理したものとは1円異なることがあるのだが、介護保険料は明示されていないのであまり目立たないというだけだ。
給与ソフトなら『五捨六入』で可
給与ソフトの使用のときは、健康保険や厚生年金保険を設定するときの端数処理の対象を『健康保険+介護保険』等の表示のものにして、端数処理の方法は『五捨六入』等に設定しておけばよい。
まぎらわしいが、普通給与ソフトで『五捨六入』というのは五捨五超入のことであり、説明書等でその辺が確認できれば大丈夫だ。