誤差が許されない小数点を扱う方法
坂田です。
インプラスの主力製品"PROKAN"シリーズでは、"生産管理"のコンピューターシステム化を提供します。
その中には当然、あるものを生産するのに必要な原価とか、対価などの"金額"を扱う場面が多く存在します。
その"金額"というものは、計算結果に1円のズレもあってはなりません。
そこで、この記事では"金額"などの誤差が許されない小数点を扱う方法を紹介します。
コンピューターは"0.1"を正確に表現できない!
実は、通常コンピューターが小数を扱う方法では"0.1"という数値を正確に表現できません。
コンピューターは2進数であらゆるデータを表現するということは知ってのとおりであると思いますが、小数も例外ではありません。
"0.1"という数値は、2進数だと無限小数になってしまいます。
では、どうしようもないのか?
コンピューターがこのように小数を扱う限り、10進数の有限小数でも正確に表現できない……
しかし、小数を表現できないのでは金額計算ができない……どうしようもないのか?
否、そんなことはありません。
一部の言語では、まさに"金額"のような小数を正確に表現するための型を提供します。
①Currency型(VB6)など、小数点以下の桁数を決め打ちする型
コンピューターは整数であれば、数値を必ず正確に表現することができます。
この性質を利用し、ある桁数より下の値は小数点以下の値として扱うことで、小数を正確に表現する方法があります。
これを、"固定小数点型"といいます。
②Decimal型(VB.NET、C#など)
こちらは①を拡張したような概念で、小数点以下の桁数に応じて小数点より上、つまり整数部の桁数を減らしていく方法を使います。
こちらも内部的には整数ですから、小数点以下の値を正確に表現することができます。
あとがき
コンピューターで正確に表現できない10進数の有限小数がある……という問題はいつも"金額"を扱うアプリの開発者を悩ませてきました。
近年はそれを解決する方法が多く出てきましたが、それでもまだこの"小数がうまく扱えない"問題は多くのプログラマを悩ませています。
特に"金額"を扱うアプリの開発者においては、"コンピューターは小数を正確に扱えない"ということを念頭に置いて、誤差の出ない小数計算ができる方法を使うべきです。