• ベストアンサー

Accessのバグなんでしょうか?

既出かもしれませんが、どなたか相談に乗ってください。 マイクロソフトACCESS97をしぶとく使っていますが、最近計算結果がおかしいことに気づきました。 下記の計算結果が思うように行きません。何か心当たりのある方、ご教授願えませんでしょうか? Int(([数量]*[単価])*100+0.5)/100 の式に対して 数量 * 単価 = 答え 0.021 * 775 = 16.275 0.253 * 775 = 196.075 と、答えを少数点第3位で四捨五入して下二桁で答えを出したいのですが、それぞれ16.27と196.07という風に0.005が切り上げられません。計算式は間違っていないと思います。ほかの数値ではこのようなことにならないのですが、今のところ上記の2パターンで四捨五入できないのです。 どなたか、「それはアクセスのバグですよ」とか「こうすればできますよ」といったお言葉をもらえないでしょうか? 長い間使ってきたシステムにこんな落とし穴があったとは。 今大変困っています。ご協力お願いします。

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

  • ベストアンサー
回答No.1

小数点の精度の問題だと思います。 Int(CCur([数量]*[単価])*100+0.5)/100 または Int((CCur([数量])*[単価])*100+0.5)/100 で試してみてください。

ikkyuu1963
質問者

お礼

おー!目からうろこです。見事に問題解決です。CCurには、全然気づきませんでした。まだまだ未熟者ですね。もっと勉強します。ありがとうございました。 ちなみに、ここのシステムを把握していませんでした。お礼はこちらだったんですね。すみません。

ikkyuu1963
質問者

補足

おー!目からうろこです。見事に問題解決です。CCurには、全然気づきませんでした。まだまだ未熟者ですね。もっと勉強します。ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#22222
noname#22222
回答No.4

丸め誤差対策は既答の通りです。 そこで、四捨五入等に利用できる関数を紹介しておきます。 小生の<ハスキー問答集> Q: 001 少数点演算での丸め誤差をなくすには? で紹介している関数です。 Public Const 四捨五入 = 0 Public Const 切り捨て = 1 Public Const 切り上げ = 2 ? Rounds(1.126, 四捨五入, 2) 1.13 ? Rounds(1.126, 切り捨て, 2) 1.12 ? Rounds(1.126, 切り上げ, 2) 1.13 と、かようなRounds関数があれば随分と楽です。 僅か、1行でこのような関数が書けます。 Public Function Rounds(ByVal M As Currency, _             ByVal A As Integer, _             Optional D As Integer = 0) As Variant     Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D End Function なお、切り上げ処理だけは、一旦切り捨てて切り上げるという配慮も必要なケースがあります。 ? Rounds(Rounds(0.0009, 切り捨て, 3), 切り上げ, 2) 0

ikkyuu1963
質問者

お礼

ご回答ありがとうございました。 最近はAccess97での作成も少なくなってきましたので、Access2003では今回のような誤差というか誤計算もほとんどないのですが、予期せぬところからびっくりするような問題が出てきたので、皆さんのお知恵を拝借させていただこうと今回投稿させていただきました。 ホントに助かりました。

すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.3

すでに原因と対策は回答されたようですが。 アクセスの機能でそれなりに回避できます 1.テーブルの[数量]、[単価]フィールドのデータ型を通貨にします(単価フィールドが常に整数であれば必要はない) 2.テーブルの[数量]フィールドの、小数点以下表示桁数を3桁にします 3.計算をするクエリーを利用すれば SELECT test.数量, test.単価, [数量]*[単価] AS a FROM test; のクエリーで[a]フィールドの小数点以下表示桁数を2桁にします これで100倍したり、100で割ったりする必要もなくなります ACCESS2000でしか確認できなかったので97で、ここら辺をサポートしていなければごめんなさい(^^;

ikkyuu1963
質問者

お礼

ご回答ありがとうございました。 へー、こんな方法もあるんですね。 別の機会で試してみます。

すると、全ての回答が全文表示されます。
  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.2

折角なので、さらに鱗を ◆“達人”芳坂和行氏に学ぶ、エクセル(Excel)「演算誤差」対策講座 1~4 http://pc.nikkeibp.co.jp/pc21/special/gosa/index.shtml もう少しショッキングな 丸めを行うカスタム プロシージャを実装する方法 http://support.microsoft.com/default.aspx?scid=kb;ja;JP196652 もどうぞ。 私も冷や汗が出ました (^_^;)

ikkyuu1963
質問者

お礼

ご回答ありがとうございます。 ギョエー!むずかしそうですねー。 じっくり読んでみます。自分の頭でついていけるかどうか・・・・ ちなみに、ここのシステムを把握していませんでした。お礼はこちらだったんですね。すみません。

ikkyuu1963
質問者

補足

ご回答ありがとうございます。 ギョエー!むずかしそうですねー。 じっくり読んでみます。自分の頭でついていけるかどうか・・・・

すると、全ての回答が全文表示されます。

関連するQ&A