- ベストアンサー
Access 集計について
サブフォームでDsumを使用しIDごとの合計を表示するようにしたのですが、結果が100になるはずですが、表示が99.9999976158142や100.000002384186となってしまいます。 上と同じ現象だと思うのですが、売上から構成比率で構成金額を算出して、同じ種類の構成金額を合計したものをはじめの売上で割り構成比率に直したものを表示し、構成比全種類を合計足した場合100になるはずなのですが、94.5と計算が間違っています。 これらの原因が分かる方お願いいたします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
原因は二つです。 Private Function Kakezan_1(ByVal Q As Single, _ ByVal P AS Currency) _As Currency Kakezan_1 = Q * P End Function [イミディエイト] ? Kakezan(2.1, 2500) 5249.9976158142 これは、通貨型(Currency)で演算して小数点演算での丸め誤差を防いでいないのが原因。 もう一つは、変数の型の不一致でも同様の現象が引き起こされます。
その他の回答 (5)
- CHRONOS_0
- ベストアンサー率54% (457/838)
>式となる数値は有限のものなのですが、内部的に無限の数値?になってるということですよね 表示しているのは内部の2進数を10進数に直した数値です 10進数では有限でも、2進数にすると無限になることがあります >これを直したいのですが更新クエリ等で直せないのでしょうか こういう問題に対処するために通貨型のようなデータ型が用意されています
- CHRONOS_0
- ベストアンサー率54% (457/838)
>これは修正できないのでしょうか? 最初の回答で書いたように有限のデータ型に無限のものは格納できません
補足
50+50=100 こう表示されるのが普通ですが、 50+50=100.00002456879 これは集計数値となる50と50が内部的に正しくないということですよね これを直したいのですが更新クエリ等で直せないのでしょうか >有限のデータ型に無限のものは格納できません 式となる数値は有限のものなのですが、内部的に無限の数値?になってるということですよね
- CHRONOS_0
- ベストアンサー率54% (457/838)
>表示されているデータと違う数値が隠れているのですかね・・・ 表示されている10進数と内部の2進数は完全に同じものでないと考えてください (2進数に変換したとき無限小数になるものは丸められるからです)
補足
ありがとうございます。 内部の2進数の数値が完全に正確ではない ということですね? これは修正できないのでしょうか?
- CHRONOS_0
- ベストアンサー率54% (457/838)
>単純な集計ミスでした。 計算ミスしなくても合わないことは生じますからね そのようなときには前回の答えを参考にしてください >sumでIDごとに合計しただけでこのようなことがなぜ起こるのでしょうか? 問題の一部だけを提示されただけでは原因は推理できません そのようになる元テーブルと計算式のサンプルをアップできますか
補足
テーブル 店コード 売上構成 (単精度浮動小数点型) 店コード 抽出条件 7786 売上構成 集計合計 以上の条件で集計クエリで合計したところ 店コード 売上構成の合計 7786 100.000000953674 以下が集計する前の数値です。 店コード 売上構成 7786 0 7786 0 7786 0 7786 0 7786 0.5 7786 0.5 7786 1 7786 2.5 7786 2.9 7786 5.9 7786 9.6 7786 10.2 7786 15.2 7786 16 7786 35.7 表示されているデータと違う数値が隠れているのですかね・・・
- CHRONOS_0
- ベストアンサー率54% (457/838)
>表示が99.9999976158142や100.000002384186となってしまいます。 割り算を行った場合、簡単に無限小数が生じますね コンピューターでは数字を限られた大きさの数値型で取り扱いますから 無限小数はそのデータ型に収まるように丸められます その結果、非常に小さい値ではありますが誤差が生じてくるのです これに対処するにはデータ型を通貨型にしてください 制限の範囲内ならこのような誤差を出さないようにしてくれます >上と同じ現象だと思うのですが、 違いますね 構成比を自分である精度に丸めているんじゃないですか そのような場合丸めの誤差が蓄積され >構成比全種類を合計足した場合100になるはずなのですが これが100にならないということが生じます これに対処する方法は昔の手書き帳簿の時代からある グループの中のひとつに誤差を吸収させてしまうという方法です グループの中の代表(一番大きな比率のものなどがよく選ばれる)の比率は 普通の計算ではなく 100-他の比率の合計としてやるのです
補足
>これが100にならないということが生じます 質問内容に書き忘れましたが、数値は小数点第二位を四捨五入しております。 ですので誤差1~2程度は仕方がないのですが、今回の場合数値が大きいので、質問させていただきました。 再度こちらで調べたところ単純な集計ミスでした。 申し訳ないです。 >割り算を行った場合、簡単に無限小数が生じますね 割り切れないものに対して無限の小数点が表示されるのは分かるのですが、DsumでIDごとに合計しただけでこのようなことがなぜ起こるのでしょうか?
お礼
ありがとうございます。 このような現象は初めてでしたので参考になりました。