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

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