浮動小数点の「特性」

* Amazon Access VBA 関連書籍情報
俺しんじらんねぇよ、Access ってさ、いや Access に限ったことじゃないんだけど、VB とかでも、割り算すっと誤差がでるんだよ!単価とか計算すっと、1円あわなかったりすんの!!!これでコンピューターって言えんのかよ?びるげいつもたかが知れてるよなぁ!!!
ちょwwwwおまwwww恥wずwかwしwいwwwwww
まーーーさーーーかーーーこんな戯言を言ってらっしゃる方は、ここの読者にはいませんよねぇ。(いるんだなそれが。そして「ばっかみたい」と捨て台詞を投稿するんだな。月に一人はいるぞ)
たしかに、浮動小数点演算では誤差が出ます。これはホントです。
しかし、この誤差は、演算処理をする人が理解して注意しなければならないもので、その利用者というのは Access なり Visual Basic なりのアプリケーションを利用する人またはそれらを利用してプログラミングをする人、つまり私達のことなのです。
浮動小数点については、Microsoft のサイトでも幾度となく説明されてきてますし、(かなり技術的に専門的に説明した文書もちゃんとある、しかも日本語)ちょっと勉強意欲のある人なら見ると思うんですけどねぇ。それとも Microsoft のいうことなんて信じないのかなぁ。たとえばこことかこことか、これも参考になるかな。こんなのも。他にもいろいろありますのでご自分でも検索してみてください。
ずっと COBOL やってきた人にとっては、ここらへん理解しがたいってキモチもわかります、なぼだってコボラーだし。
COBOL の9タイプ(数値型といわれているやつ)は、実は数値ではなくて文字なんですよね。実行モジュール(コンパイルユニットかも)になった段階で文字型を数値型に置き換える処理が入るんですけど、実行中9タイプの変数に数字以外の文字が入ると十進数に変換できないよ的な実行エラーが発生しますよね。だから、COBOL やってる限り、Integer だの Long だのというコンピューターが直接数値と認識できるデータ型とオツキアイする機会はないんです。(少なくとも N○C 汎用機系の COBOL では無かった いまの PC COBOL は定かではないです)
浮動小数点については、誤差がでるというデメリットもありますが、固定小数点に比べて小数点以下の桁数に制限が無い(実際はありますけど、いっぱいいっぱいまで持てる)、演算速度が速いというメリットがあります。こんぴゅーたで言う演算ってのは何も単価の計算だの消費税の計算だのばっかりじゃありませんから。
そーは言っても、ビジネス(いや個人ユースでも)で使う場合、単価だの消費税だのの計算に誤差がでちゃー困ります。
「やっぱそうだろ??だって電卓は誤差なんか出ねぇもんなぁ!!!」なんて喜んで叫んではダメですよ。
ハードウェアとしての電卓はもちろん誤差が出ないよう処理してますし、根本的に PC だの Windows とは別物です。
Windows についてる電卓は、「電卓」というソフトが誤差が出ないよーに計算して表示しているのです。
つまり、冒頭でもちと述べましたが、演算誤差に注意して最適なデータ型を選択するのはソフトウェアの仕事であり、誤差が出ちゃ困るのであればそれなりのコードを書かなきゃダメなんです。
んじゃ、Access や Visual Basic ではどうすればよいか。割り算、小数点演算などで誤差が出ては困るものについては、浮動小数点型を使わずに通貨型を利用しましょう。
通貨型は固定小数点型です。小数点以下4位までしか扱えないというデメリットはありますが、割り算しようが掛け算しようが誤差は出ません。(オーバーフローしちゃうような場合は除く)フツーの金額計算には十分対応できるレベルかと。
AccessVBA でも Visual Basic でもそうですが、モジュール内で演算処理を行った場合、型を明示的に宣言しないと通貨型は使われませんので注意が必要です。
dim A as Currency
dim B as Currency
B = CCur(A / 25)
と、まぁここまでシツコク書く必要ない場合もあるかもしれませんけど、こう書くのが一番確実だし、あとでこのコードを見た人にも分かりやすいと思うんで、なぼはいつも CCur 関数のお世話になっています。いつものよーに、CCur 関数についてはヘルプで。
もしくは、自分で小数点を使わない計算ロジックを作ってしまうなんてやり方もありますね。COBOL みたいに、内部では数値を文字型で持ち、小数点の位置を別に持ちます。すべて整数で演算した結果に小数点の位置を付加し、その結果も文字列として扱います。
こういうカスタムモジュールを作っておいて利用するってテも無いわけではありませんが、計算速度は誉められたものじゃないでしょうね(^_^;) 型のキャストが何度もかかるし。あんまりお勧めはできませんけど、それより誤差が出ないほうが先決さって場合も十分ありますし。
どんなふうに扱うとしても、メリットとデメリットは常に存在するものです。