質問: ### 質問事項 VBA の丸め誤差(?)についての質問です。 以下のコードの実行結果の理由が分からず困っています。 ``` Debug.Print Int(0.95 + 0.05) ' 0 となる Debug.Print Int((95# / 100#) + 0.05) ' 1 となる ``` `0.95` と `0.05` はそれぞれ循環小数のため `Int(0.95 + 0.05)` の実行結果が `0` となることは理解していますが、`Int((95#/100#) + 0.05)` の実行結果が `1` となるのが理解できません。 `0.95` と `(95#/100#)` は等価のように思えるのですが異なるのでしょうか? 型が何か関係しているのかと思い、試しに以下のようにして型の確認を行いました。 ``` Debug.Print TypeName(0.95) ' Double となる Debug.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
回答: 小数(浮動小数点数型)の計算が思った結果にならない理由と解決法 Decimal型はいつ使うか? このあたりが参考になりますね。 Float の誤差は言語を問わず発生することで、プログラミングをやる上では頻繁に遭遇しますので、基礎知識としておきましょう。