消費税15%になるとコンピュータ暴走?!

消費税10%で大きな問題も起きず、一安心しているシステム管理者も多いことでしょう。私もその一人です。

さて、これまで

3% →  5% → 8% → 10%

と上がってきた消費税ですが、今後、もし15%になると、これまで起きなかった問題が起きることが予想されます。

それは…………………………

コンピュータの計算が狂う

のです。

百円のものに15%の消費税がかかるという計算を、コンピュータで普通にやってみます。ここでは Macの Pythonというプログラミング言語でやった例を表示します。

「*」はかけ算の意味です。

消費税は、一般的に切り捨て(*1)となるので、百円のものを買えば115円になるはずが、114円になってしまうという計算結果になるのです!

どうしてこんなことが起きるのでしょう?

それは、コンピュータは内部では2進数を使っていて、小数点以下の数字は2進数で正確に表せないことが多いから、なのです。

「え?! どんな数でも2進数で表せるよね?」

と思われる方も多いでしょう。整数においてはそうなのです。

10進数で表される小数点以下の数が他のN進数で表せないということを感覚的に理解してもらうために、3進数を考えてみることにします。

3進数は3つ集まると桁があがります。

1、2の次は3ではなく、10になり、その後は、11、12となって、その次は20になります。

使われる数字は0、1、2の3つです。

では3進数の0.1はどういう数でしょう?

0.1が3つ集まったら桁があがるので、1になります。

ということは、3進数の0.1は10進数で言えば、1を3で割った数で、0.33333……になり、どこかで桁を切らざるを得ず、微妙な誤差が出てしまいます。

この例では、3進数→10進数で誤差がでるという話ですが、同様なことが10進数→2進数でもあって、お互いに小数点以下の数は誤差がでることが多いのです。

では、なぜこれまでの3%、5%、8%、そして今回の10%の時に起きなかったのでしょう?

理由は簡単で、「2進数の値が、ほんのすこし大きかった」からです。ほんの少し大きい数をかけて、最後に切り捨てにするので問題になりませんでした。

下の表の、1.03、1.05、1.08、1.10のコンピュータ内部の数を見てください。いずれもすこし大きくなっています。

それに対して、消費税13%から消費税16%については、ほんの少し小さくなります。それが原因で百円の消費税が1円少なくなってしまうのです。

念のため、百円のものに対する消費税を30%まで誤差を計算してみたところ、消費税13%から16%の時に、誤差が出ることがわかりました。

面白いのが、値段によって誤差が出る時とでないときがあります。

たとえば、300円のもので計算すると、誤差がでないのに、400円だと誤差がでます。

買い物をする側にとっては1円トクをする話です。

ただし、これにはちゃんと対策があって、整数計算にする方法がその一つです。

つまり 100 × 1.15を計算するのではなく

100 ×  115 ÷ 100

というふうに整数計算にしてしまう方法や、精度の高いライブラリを使うなど、いくつか対策があります。

15%の消費税の時に、対策をしていないと100円の商品に対して14円の消費税になることが予想され、しかも値段によって正しい答えが出たりするので混乱しそうです。

(*1)消費税に端数が出た場合は、切り捨て以外の方法も法的には可能なようですが、ほとんどのお店では切り捨てにしています。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)