2016年11月29日

Excelで同じ数同士の引き算をしても、結果が0にならない不思議

【1−0.1×10は? 人工知能に怯える前に知ってほしいこと】
http://itpro.nikkeibp.co.jp/atcl/watcher/14/334361/112100725/

この記事では、Excelで1−0.1×10を計算すると0にならない、ことを紹介しています。
※厳密には(1−0.1−0.1・・・)と0.1を10回引き算するのですが。

小学校で算数を勉強した人からすれば意外に思う点ですが、これはコンピュータ計算の特性でもあります。
記事中でも次のように書かれていますが


これは、コンピュータのすごさとダメさの両面を、その仕組みとともに体験したうえで、コンピュータとの付き合い方を考えて身に付けるきっかけになればという思いからである

人工知能の脅威に怯える前に、コンピュータおよびプログラミングについて理解を深め、それらとの付き合い方を考えてみてはいかがだろうか。


人間が考えるようにコンピュータを動作させることの難しさを表現した記事でもあります。

実は、人間が学校で学んだ計算処理方式と、コンピュータが採用している計算処理方式が同じでないため、こういうことが起こるのです。
この記事では、なぜ1−0.1×10が0にならないかについては、丁寧に説明をしていません。
この記事を読んだ一般の人は、納得いかない妙な気分だけが残ってしまったかもしれませんね。私はその理由を知っていますが、これを説明するにはある程度の文章量でいくつかの前提を説明する必要があるので、私もここは割愛します。
怒らないでください(笑)


さて、この「同じ数を引き算すると0にならない事象」ですが、金融の現場では無視できないこともあります。
例えば、ライフプランシミュレーションなどシミュレーション系のシステムなら適当に四捨五入しちゃって問題ありません。
でも、例えば次のような場合、

・住宅ローン返済で、最後の月の返済をしたときに、住宅ローンの残高が1円未満の微量数になる
・預金の全額払い戻しの時、口座残高が1円未満の微量数になる

というケースでは、この微量数をうやむやにすることはできません。

この1円未満の微量数も、取引件数が増えて積みあがればその合計は1円を超え、時には万円の単位を超えることもあります。
これは金融取引会計上には現れないお金ともなるので、このお金をこっそり自分の口座に送金・・・なんてことがあってはいけないわけです。
なので、きっちりと小数点以下の端数処理を規定したり、そもそも同じ数の引き算をして0にならない仕組みを採用してプログラムを作っています。

システム屋さんの教育でも使われる話であり、久しぶりに思い出させてくれた記事でした。
でも、本文は人工知能とは一切関係ないのに、「人工知能に怯える前に」なんてタイトルをつけているので、これは釣りタイトルだなあとも思ったのでした。
posted by キヨ at 08:04| Comment(0) | TrackBack(0) | システム開発