消費税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)消費税に端数が出た場合は、切り捨て以外の方法も法的には可能なようですが、ほとんどのお店では切り捨てにしています。