海外旅行から帰ってきたら、まず何を食べる?

既出かもしれませんが、どなたか相談に乗ってください。
マイクロソフトACCESS97をしぶとく使っていますが、最近計算結果がおかしいことに気づきました。
下記の計算結果が思うように行きません。何か心当たりのある方、ご教授願えませんでしょうか?

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

A 回答 (4件)

小数点の精度の問題だと思います。


Int(CCur([数量]*[単価])*100+0.5)/100
または
Int((CCur([数量])*[単価])*100+0.5)/100
で試してみてください。

この回答への補足

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

補足日時:2006/09/13 01:01
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/14 02:20

丸め誤差対策は既答の通りです。


そこで、四捨五入等に利用できる関数を紹介しておきます。

小生の<ハスキー問答集>

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/14 02:38

すでに原因と対策は回答されたようですが。



アクセスの機能でそれなりに回避できます

1.テーブルの[数量]、[単価]フィールドのデータ型を通貨にします(単価フィールドが常に整数であれば必要はない)

2.テーブルの[数量]フィールドの、小数点以下表示桁数を3桁にします

3.計算をするクエリーを利用すれば
SELECT test.数量, test.単価, [数量]*[単価] AS a
FROM test;
のクエリーで[a]フィールドの小数点以下表示桁数を2桁にします

これで100倍したり、100で割ったりする必要もなくなります
ACCESS2000でしか確認できなかったので97で、ここら辺をサポートしていなければごめんなさい(^^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/14 02:31

折角なので、さらに鱗を


◆“達人”芳坂和行氏に学ぶ、エクセル(Excel)「演算誤差」対策講座 1~4
http://pc.nikkeibp.co.jp/pc21/special/gosa/index …

もう少しショッキングな
丸めを行うカスタム プロシージャを実装する方法
http://support.microsoft.com/default.aspx?scid=k …
もどうぞ。
私も冷や汗が出ました (^_^;)

この回答への補足

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

補足日時:2006/09/14 02:16
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/14 02:21

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

関連するカテゴリからQ&Aを探す


おすすめ情報