質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

4回答

1975閲覧

AccessVBAの演算誤差について

syncrock

総合スコア209

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/03/08 01:38

AccessのVBAにて演算処理を行っていたところ、演算誤差が発生しました。
該当のコードではないですがその個所を抜粋したサンプルが以下になります。

vba

1Private Function test() 2 3 Dim item1 As String 4 Dim item2 As Single 5 Dim item3 As Single 6 7 item1 = "500" 8 item2 = 0.08 9 item3 = 5 10 11 Debug.Print 500 * 0.08 * 5 12 Debug.Print Val(item1) * item2 * item3 13 14End Function

調べてみると、演算誤差を発生させないように通貨型を使用した方が良い(?)との記事をみかけます。
実際に以下コードに修正すると演算誤差は発生しません。

vba

1Private Function test() 2 3 Dim item1 As String 4 Dim item2 As Currency 5 Dim item3 As Currency 6 7 item1 = "500" 8 item2 = 0.08 9 item3 = 5 10 11 Debug.Print 500 * 0.08 * 5 12 Debug.Print Val(item1) * item2 * item3 13 14End Function

今回初めてこのようなケースにでくわしたのですが、
小数点演算を行う場合、AccessのVBAでは通常Currency型を使うことがお決まりなのでしょうか。
(double型も問題なかったのですが、それは今回のケースではたまたまうまくいったということでしょうか。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

Doubleは、2進数の浮動小数点型なので、2の冪乗の有限個の和で表せない数は正確に表現できません。
つまり、・・・・, 64, 32, 16, 8, 4, 2, 1, 0, 0.5, 0.25, 0.125, 0.0625, ・・・
の有限個(有効桁数の範囲内で)の和である事が必要です。

0.1 や 0.08 はこれに該当しないので、正確に表現できません。

全ての整数はこれに該当するので、doubleであっても整数であれば有効桁数の範囲内で正確に表現できますし、Integer等の整数型も2進数ですが、整数なので有効桁数の範囲内で正確です。

なお、正確に表現できない数を含んだ計算であっても、結果丸めの関係で、正確に計算できてるっぽく見える事はあります。

Currencyも内部は2進数なのですが、整数型であり、値を10,000倍してから変数に格納しているので、小数点以下4桁までは正確に表現できます。変数から取り出すときにまた10,000で割ります。

投稿2019/03/08 03:42

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

コンピューターのプログラムの世界では、浮動小数点には誤差があるというのは常識です。
「浮動小数点 誤差」でWEB検索するとやまほど解説ページが見つかりますので、一度、目を通しておくことをお勧めします。

ということで、

小数点演算を行う場合、AccessのVBAでは通常Currency型を使うことがお決まりなのでしょうか。

小数点以下4桁までで誤差が許容されない仕様なら、そうなります。
もともと、誤差が含まれている実験結果の計測値などの演算で、小数点4桁以上の精度が必要なら、浮動小数点型を選択します。

誤差も許容できなく小数点4桁以上の精度が必要なら十進型になりますが、そのような場合はあまりないかと思います。十進型はパフォーマンスが悪いし、いろいろ制限があったと思いますので、めったに使われてないと思います。

投稿2019/03/08 03:41

hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2019/03/08 04:53

回答ありがとうございます。 >小数点以下4桁までで誤差が許容されない仕様なら、そうなります。 そこまでの精度で問題ないので、お決まり(常識?)という点了解しました。 誤差について軽く調べたもののあまりピンとこなかったので、もう少し調べようと思います。
guest

0

CREATE TABLE 等での型指定に DECIMAL を使用する場合は、
DAO ではなく ADO で実行する必要があります。

投稿2019/03/08 02:52

iruyas

総合スコア1067

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

浮動小数点付のデータ型では誤差が生じます。
十進型や通貨型の使用をお薦めします。
尚、データ定義クエリーでの、create table等の型指定に、十進数(decimal)は使用できませんのでご注意下さい。

投稿2019/03/08 02:06

編集2019/03/08 03:00
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sousuke

2019/03/08 03:05

Accessのテーブルで数値型選んでフィールドサイズを「十進型」に すればとりあえずは十進型になりませんでした? DDLでは不可能だったのは覚えがあるんですがGUIではできたと思います。
sazi

2019/03/08 03:10

GUIでは可能ですね。 質問されている環境ではどのようにされているか分からなかったので、蛇足です。
sazi

2019/03/08 03:21

蛇足ついでに、2016から追加されたbigintに対応する、「大きい数値」はDDLで定義できないのでイラっとします。 XMLでエクスポート/インポートするとエラーになったり型が変わったりするので、さらにイライラが・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問