• ベストアンサー

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

  • access2003と2007のRound関数について

    以前見た質問でround関数で四捨五入をするときは、 access97は銀行型の四捨五入をする access2000はround関数にバグがある という回答を見ました。 http://oshiete1.goo.ne.jp/qa3593239.html ちなみにaccess2003と2007はどうなんでしょうか? やはり四捨五入はint関数を使うほうが無難なのでしょうか? ご存知の方いらっしゃいましたらご教授下さい。 よろしくお願いします。

  • Accessで四捨五入するには?

    過去の質問を読んでもどうもうまくいかないので質問です。 数量と単価をかけて金額を計算したいんですが、数量は小数点第2位まで存在します。 数量と単位をかけてその値を四捨五入するにはどうしたらいいでしょうか? わかる方よろしくお願いします。

  • Access2000 小数第3位で四捨五入

    質問させていただきます。 Access2000で以下の計算式を作りました。 金額 = Round(重量 × 単価,2) これは「金額」を小数第3位で四捨五入します。 ところが以下の数値の場合、正しく計算してくれません。 764.00 = 0.479 × 1595 本当は 764.005 だから 小数第3位で四捨五入すると 764.01 になると思うのですが・・・。 ちなみに以下の値では・・・ 754.44 = 0.473 × 1595 (754.435だから小数第3位で正しく四捨五入されています)。 やり方が悪いのでしょうか?それとも他に正しく計算できる方法があるのでしょうか?

  • 有効数字(有効桁数)と四捨五入について・・・。

    自分は現在高校生です。物理化学数学でカテゴリ迷ったのですがこちらに。 四捨五入、有効数字に関する質問は過去にもあるのですが、何か腑に落ちないので質問させて貰います。 学校では、 http://www.fnorio.com/0034significant_figure1/significant_figure.htm にあるように、「有効数字+1桁までを計算して結果を出し、その結果を有効数字にまとめろ」と習います。 しかしこれをやってしまうと、以下有効数字による表記として、 ア・・・1.1+1.445=2.545→(有効数字2桁なので四捨五入)→2.5 イ・・・1.1+1.445→(まず有効数字を3桁にしてみる) →1.1+1.45=2.55→(有効数字2桁なので四捨五入)→2.6 となり答えが違ってきます。 じゃあ有効数字+2桁まで計算すればいいのかと思うと、 ウ・・・1.1+1.4495=2.5495→(有効数字2桁なので四捨五入)→2.5 エ・・・1.1+1.4495→(有効数字4桁にしてみる)→1.1+1.450=2.550→(有効数字2桁なので四捨五入)→2.6 となりやっぱり答えが変わるパターンがあります。 乗除については、 (四捨五入せずに)積を計算→結果を有効数字+1桁に変換→・・・ なんてことを繰り返していると+1桁程度では厳密に計算したものとかなり違ってくると思います。 実際、高校の物理や化学ではア~エは全部正解にしてくれると思うのですが(エはよく分かりませんが・・・)、数学的にはどうなのでしょうか。 また、誤差の大きくなってしまう乗除はどうすればいいのでしょうか。

  • エクセルの関数

    以下のようなことをエクセルでやりたいのですが 何か関数はありませんか? 例:A×B=答え 上記の答えの 正数が二桁のとき、小数点第二位を四捨五入 正数が三桁のとき、少数点第一位を四捨五入 どなたか教えてください。お願いします。

  • 四捨五入ってどうやるのでしょう?

    少数第2位を四捨五入するのにはBigDecimal#setScale(int,int)を使うのは 分かるのですが、では少数第21位を四捨五入するのはどうすればよいのでしょうか?同じものを使うのか、それとも・・・。知っている方がいたら教えて下さい。

    • ベストアンサー
    • Java
  • 有効数字(有効桁)の考え方

    小数を含んだ計算ですが,以下の押さえで正しいでしょうか? いくつかサイトを見て,こうなのかな?と思ってまとめてみたのですが... ((1)の「4」,(2)の「5」に関しては誤差を含まない数とする) (1)6.523×4=26.092 (2)6.524×5=32.620      (小数第3位の0は必要) (3)65.23+6.524=71.754       →71.75(四捨五入(各々4桁故)) (4)65.23÷6.524=9.99846719…       →9.998(四捨五入) (5)65.23÷6.52=10.00460122…       →10.0(四捨五入(6.52が3桁故答えは3桁まで)) (6)6.523×6.524=42.556052       →42.46(四捨五入(各々4桁故)) (7)6.523×6.52=42.52996       →42.5(四捨五入(6.52が3桁故)) 正しいでしょうか?

  • Excelで作った表で・・・

     よくある「単価×数量」の表を作りました。 答えに小数点以下になるものが含まれるため、その列に セル書式で小数点以下を四捨五入して整数になるように 設定しました。それぞれの答えはそれで良かったのですが、今度はさらにそれらの合計を求めようと「SUM」を 入力したら表示された整数の合計ではなく、 それぞれのセルある小数点以下の数次を合計して四捨五入してしまいます。  (例)単価×数量=1.2 表示は1    単価×数量=1.3 表示は1        計 3 になってしまう←「2」にしたい       どうしたらいいのでしょうか?教えてください。

  • 有効数字について

    有効数字についての質問です。 有効数字2ケタで答える問題があるとします。 途中の計算がいくつかに分かれる場合は、3ケタ目まで計算して進めていき、 最後に出た答えを四捨五入する、 と習ったのですが、 「途中の3桁」というのは、4桁目まで計算して四捨五入するのか、3桁目で計算をやめて以降を切り捨てるのかがわかりません。 よろしくお願いします。

  • Accessで困ってます

    フィールドで式を組んで出て来た答えを四捨五入したいんですがどうすればよろしいのでしょうか? 例えば 155÷128-1×100=21.09375%→21.1% としたいです。 また、式の計算過程で四捨五入することもできますか? 例えば 155÷128×100=121.09375→121.1 121.1-100=21.1% 以上の二点お教えください。

このQ&Aのポイント
  • 小型DCモーターの速度コントロールについて調査中です。
  • モーターMMA-6B6LA(6V定格)は電気蓄音機のターンテーブル駆動用に使用されています。
  • 回転が速くなる問題を解決するための有効な方法を探しています。
回答を見る