誤差が許されない小数点を扱う方法

坂田です。

インプラスの主力製品"PROKAN"シリーズでは、"生産管理"のコンピューターシステム化を提供します。

その中には当然、あるものを生産するのに必要な原価とか、対価などの"金額"を扱う場面が多く存在します。

その"金額"というものは、計算結果に1円のズレもあってはなりません。

そこで、この記事では"金額"などの誤差が許されない小数点を扱う方法を紹介します。

コンピューターは"0.1"を正確に表現できない!

実は、通常コンピューターが小数を扱う方法では"0.1"という数値を正確に表現できません。


コンピューターは2進数であらゆるデータを表現するということは知ってのとおりであると思いますが、小数も例外ではありません。
"0.1"という数値は、2進数だと無限小数になってしまいます。

では、どうしようもないのか?

コンピューターがこのように小数を扱う限り、10進数の有限小数でも正確に表現できない……
しかし、小数を表現できないのでは金額計算ができない……どうしようもないのか?
否、そんなことはありません。
一部の言語では、まさに"金額"のような小数を正確に表現するための型を提供します。

①Currency型(VB6)など、小数点以下の桁数を決め打ちする型

コンピューターは整数であれば、数値を必ず正確に表現することができます。
この性質を利用し、ある桁数より下の値は小数点以下の値として扱うことで、小数を正確に表現する方法があります。
これを、"固定小数点型"といいます。

②Decimal型(VB.NET、C#など)

こちらは①を拡張したような概念で、小数点以下の桁数に応じて小数点より上、つまり整数部の桁数を減らしていく方法を使います。
こちらも内部的には整数ですから、小数点以下の値を正確に表現することができます。

あとがき

コンピューターで正確に表現できない10進数の有限小数がある……という問題はいつも"金額"を扱うアプリの開発者を悩ませてきました。
近年はそれを解決する方法が多く出てきましたが、それでもまだこの"小数がうまく扱えない"問題は多くのプログラマを悩ませています。
特に"金額"を扱うアプリの開発者においては、"コンピューターは小数を正確に扱えない"ということを念頭に置いて、誤差の出ない小数計算ができる方法を使うべきです。

このブログの人気の投稿

技術メモ「503 Service Unavailable」

グーグルグループのメーリングリストの返信先が個人になってしまう

『ネットワークドライブ』のトラブル