プロが教えるわが家の防犯対策術!

ACCESS2010のVBAで記述中につまづきました。

イミディエイトウィンドウで、
?(Int(4140000 * 0.15))
という計算をさせると、結果が「621,000」とならなければならないのに、なぜか「620,999」となります。
なぜでしょうか?
原因が分からず非常に困っております。

A 回答 (4件)

おそらく、小数点の扱いで数値の丸めが発生しているためと思われます。


対応策については、こちらが参考になるかと思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.ph …
    • good
    • 0
この回答へのお礼

紹介されたリンク先がドンピシャの内容でした。結果としては、「*0.15」ではなく「*15/100」とすると正しく計算されるようになりました。

お礼日時:2014/03/19 12:32

こんにちは。



4140000 * 0.15
の結果は、小数部がありますから、浮動小数点丸め誤差が発生し、求める値が、倍精度浮動小数点型(Double)や単精度浮動小数点型(Single)の場合、丸め誤差が発生して、Int関数を使えば、「621000」にはならず、620999 になるわけです。

現象と対処の仕方は、大雑把には以下に書かれています。
http://support.microsoft.com/kb/196652/ja

VBA/VB6では、「浮動小数点誤差」に関しては、いくつかの解決方法があります。

整数変換法
(4140000 * 0.15 * 100) / 100

算術法
Fix(4140000 * 0.15+0.005) '←使用される小数点よりも小さい値を加える(ただし、正の場合)
Int関数は正負で非対称です。Int関数の場合は、SgnとAbs 関数を使い、符号を別にして計算します。

通過型や10進に変換
CDec(4140000 * 0.15)
CCur(4140000 * 0.15) '←通貨型は、15桁の整数部分と4桁の小数部分で桁数が限られている
    • good
    • 0

解決策は数値が収められているフィールドのデータ型を『通貨型』にして下さい


四則計算を行う数値のデータ型は『単精度浮動小数点型』にしないのは常識だそうです
(私も最近知ったのですが、そんな事Accessの入門書に書いてないですよね ^_^; )

原因は私には説明できません
『単精度浮動小数点型』『誤差』でググればいっぱい出てくるでしょう

難しいですね(^_^;)
    • good
    • 0

「銀行型丸め」というらしいです。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。初めてその丸め方法を聞きました。調べてみます。

お礼日時:2014/03/19 12:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!