• ベストアンサー

VBAでのINT関数の計算結果について

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

質問者が選んだベストアンサー

  • ベストアンサー
  • denbee
  • ベストアンサー率28% (192/671)
回答No.1

おそらく、小数点の扱いで数値の丸めが発生しているためと思われます。 対応策については、こちらが参考になるかと思います。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=44107&forum=36

mkydf975
質問者

お礼

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

その他の回答 (3)

回答No.4

こんにちは。 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桁の小数部分で桁数が限られている

回答No.3

解決策は数値が収められているフィールドのデータ型を『通貨型』にして下さい 四則計算を行う数値のデータ型は『単精度浮動小数点型』にしないのは常識だそうです (私も最近知ったのですが、そんな事Accessの入門書に書いてないですよね ^_^; ) 原因は私には説明できません 『単精度浮動小数点型』『誤差』でググればいっぱい出てくるでしょう 難しいですね(^_^;)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

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

mkydf975
質問者

お礼

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

関連するQ&A

専門家に質問してみよう