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

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

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

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

Access

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

Q&A

2回答

2469閲覧

丸め誤差について

yamagh

総合スコア8

VBA

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

Access

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

0グッド

0クリップ

投稿2016/05/30 12:26

編集2016/05/30 12:39

###質問事項

VBA の丸め誤差(?)についての質問です。
以下のコードの実行結果の理由が分からず困っています。

vb

1Debug.Print Int(0.95 + 0.05) ' 0 となる 2Debug.Print Int((95# / 100#) + 0.05) ' 1 となる

0.950.05 はそれぞれ循環小数のため Int(0.95 + 0.05) の実行結果が 0 となることは理解していますが、Int((95#/100#) + 0.05) の実行結果が 1 となるのが理解できません。

0.95(95#/100#) は等価のように思えるのですが異なるのでしょうか?
型が何か関係しているのかと思い、試しに以下のようにして型の確認を行いました。

vb

1Debug.Print TypeName(0.95) ' Double となる 2Debug.Print TypeName(95#/100#) ' Double となる

どちらも Double となり型の違いによる計算結果の違いではなさそうだと考えています。

計算処理内部の動作がどうなっているか確認する方法が思いつかなかったためディスアセンブルして確認を試みているのですが、なかなか大変なので質問させていただきました。

補足

浮動小数点数によって誤差が出る問題に対しては通貨型や十進数型を使えば良いことは理解しています。
上記のコードの実行結果の理由についてご教授くださいませ。

###補足情報(言語/FW/ツール等のバージョンなど)

  • Windows10 Pro(32bit)
  • Microsoft Office Professional Plus 2010 14.0.4734.1000 (32ビット)
  • Microsoft Visual Basic for Applications 7.0 (Version:1589)
  • Intel Pentium P6100 @ 2.00Gz

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

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

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

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

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

guest

回答2

0

各数値を有効数字の桁数を制限した浮動小数点数(a x 2^b)で表し
(doubleだと二進数52桁だが原理的な話なので数桁でもいい)
実際に割り算(a1/a2 x 2^(b1-b2))してみるとわかるはずです。

例えば仮数部が小数点4桁、0方向丸めとすれば
0.95 -> 0.1111 x 2^0
95.0 -> 0.1011 x 2^7
100.0 -> 0.1100 x 2^7

95.0/100.0 -(> 0.11101 x 2^0 -丸め)-> 0.1110 x 2^0

投稿2016/05/30 13:02

編集2016/05/30 13:22
ozwk

総合スコア13521

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

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

yamagh

2016/05/31 00:55 編集

ご説明を読んでなるほど!と思ったのですが私の理解の及ばない所がありました。 小数点 4 桁で考えた場合 0.95 は 0.1111 x 2^0 95/100 は 0.1110 x 2^0 なので 0.95 と 95/100 が等しくならないので等価ではない、と示していただいたと思うのですが、これには納得です。 同様にして小数点 8 桁でも考えてみました。 0.95 → 0.1111 0011 x 2^0 95 → 0.0101 1111 x 2^8 100 → 0.0110 0100 x 2^8 95/100 の結果が 0.95 (0.1111 0011 x 2^0) と同じにならないことを期待したのですが、何度計算しても同じになってしまいます… 何か私が勘違いしているだけだとは思いますが、補足でご説明いただけると助かります。
guest

0

小数(浮動小数点数型)の計算が思った結果にならない理由と解決法
Decimal型はいつ使うか?

このあたりが参考になりますね。
Float の誤差は言語を問わず発生することで、プログラミングをやる上では頻繁に遭遇しますので、基礎知識としておきましょう。

投稿2016/05/30 12:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yamagh

2016/05/30 15:00

さっそくのご回答ありがとうございます。 しかしスミマセン。私の説明不足により期待していた回答とちょっと違うものでした(汗) 質問文に補足を追加させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問