- ベストアンサー
VBAでのINT関数の計算結果について
ACCESS2010のVBAで記述中につまづきました。 イミディエイトウィンドウで、 ?(Int(4140000 * 0.15)) という計算をさせると、結果が「621,000」とならなければならないのに、なぜか「620,999」となります。 なぜでしょうか? 原因が分からず非常に困っております。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
おそらく、小数点の扱いで数値の丸めが発生しているためと思われます。 対応策については、こちらが参考になるかと思います。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44107&forum=36
その他の回答 (3)
- WindFaller
- ベストアンサー率57% (465/803)
こんにちは。 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桁の小数部分で桁数が限られている
- puku_oh_pu
- ベストアンサー率47% (47/99)
解決策は数値が収められているフィールドのデータ型を『通貨型』にして下さい 四則計算を行う数値のデータ型は『単精度浮動小数点型』にしないのは常識だそうです (私も最近知ったのですが、そんな事Accessの入門書に書いてないですよね ^_^; ) 原因は私には説明できません 『単精度浮動小数点型』『誤差』でググればいっぱい出てくるでしょう 難しいですね(^_^;)
- bin-chan
- ベストアンサー率33% (1403/4213)
「銀行型丸め」というらしいです。
お礼
回答ありがとうございます。初めてその丸め方法を聞きました。調べてみます。
お礼
紹介されたリンク先がドンピシャの内容でした。結果としては、「*0.15」ではなく「*15/100」とすると正しく計算されるようになりました。