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

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

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

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

Access

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

Q&A

解決済

3回答

6358閲覧

小数点の数値がある場合に正確な計算を行うには?

u_zu

総合スコア50

VBA

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

Access

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

0グッド

0クリップ

投稿2019/05/27 12:24

小数点の誤差について

VBA(EXCELやACCESSなど)で小数点を扱う際なのですが、金額などを計算するので、誤差がでないようにしたいです。
通貨型やDecimal型を使うようにしています、通貨型は小数4桁まででしたら大丈夫、とよく聞きますが、例えば0.1などは
10進数では小数1桁ですが、2進数では「0.10001」などのように近似値で扱っている、と本にあります(ネットでは0.000110011001100110011...などと書かれている?)。

これから判断すると、小数4桁以上の桁があるので、通貨型で0.1を扱っても誤差がでてしまうのではないでしょうか?
実験してみました。

Dim var As Currency
Dim count As Long

For count = 1 To 1000000
var = var + 0.1
Next

MsgBox var

varは100000と正確な数値がでます。

これはどのように考えたらよいのでしょうか?
10進数で小数4桁以下なら、currency型を使えば電卓のように?正確な計算ができると考えてよろしいのでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

簡単にいうと、

通貨型は、
内部的には整数(LongLong型)で格納されていて、
表示するときに、末尾から4桁目に小数点を表示している。

ということだと思います。

日付/時刻型の場合は、
内部的には、1899/12/30を起点とする経過日数が倍精度浮動小数点(Double型)で格納されていて、
表示するときに、書式設定にあわせて日付として表示している。

と同じことです。

その”4桁の小数”というのが10進数での4桁かどうかが知りたいのですが。。。

まず、VBAにおいて、内部的には整数も小数もすべて2進数です。演算も2進数で行います。
表示するときに、10進数に変換して表示しています。

2進数の整数の演算は誤差は生じませんが、
10進数の小数を正確に2進数の小数に変換できないので近似値の2進数になるため誤差が生じます。

通貨型の”4桁の小数”部分は、"2進数の整数"です。それを10進数の小数のように表示しているということです。

投稿2019/05/27 20:26

編集2019/05/27 20:48
hatena19

総合スコア33620

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

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

u_zu

2019/05/28 12:48

ありがとうございます。
guest

0

TanakaHiroaki さんの回答されている通りですが、補足の例として。

64bit版VBAで使える型としてLongLong型(64ビット符号付き整数)というものがあり最大値は9223372036854775807です。

Currencyも大きさは64ビットで、最大値は922337203685477.5807です。

そして上記のふたつの数値を並べてみると以下になります。

9223372036854775807 922337203685477.5807

LongLongとCurrencyの最大値は小数点の位置が違うだけで、数字の並びとしては同じ、
つまり整数と同じ形式で情報を持っています。

そのため、その型が保証している桁数の範囲内では整数の演算と同等の精度となります。

Currency
LongLong
固定小数点数

投稿2019/05/27 13:20

imihito

総合スコア2166

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

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

TanakaHiroaki

2019/05/27 13:25

とても解りやすい解説ありがとうございます。
u_zu

2019/05/27 13:56

回答ありがとうございます。
guest

0

通貨型(Currency)は4桁の小数に対応しており、一旦整数化して計算したうえで少数に戻す方法であるため、4桁の小数までは誤差が生じないとされています。

投稿2019/05/27 12:39

TanakaHiroaki

総合スコア1063

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

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

u_zu

2019/05/27 12:46

回答ありがとうございます。その”4桁の小数”というのが10進数での4桁かどうかが知りたいのですが。。。
TanakaHiroaki

2019/05/27 13:02 編集

小数を2進数で表現する場合に誤差が生じることと、それを解決する方法として通貨型(Currency)が存在することについて調べてみて、自分なりに考えてみてください。 理解が深まると、5桁の小数の場合の対応方法も自然と学習できるようになると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問