はじめまして、みなさま。
初めてココにきました。
質問がありまして、解決できるとうれしく思います。
みなさま、宜しくお願いします。
こんな計算を行ってみたら、変数に「8.000001E-06」が
入ってました。なぜなのでしょうか?
そして、どうすれば、正常な計算値がはいるのでしょうか?
教えてください。
<計算>
Dim a As Single
Dim b As Single
Dim c As String
a = 0.008
b = 0.001
c = a * b
宜しくお願いします!!
いや…二進で考えたときには、非常に精度が高い計算かと。
十進で考えたようにしたいときはDecimal型に変換して計算するか、
VBの浮動小数点演算ではなく、自前で装備する必要があるかと。
…最近この手の質問増えてきたなぁ。
※俺は誤差については不得手です、ほかの人のレスを参考にしてみましょう。
・浮動小数点型の有効桁数と計算誤差に注意すること。
・暗黙の型変換をやめること。
Dim a As Double
Dim b As Double
Dim c As String
a = 0.008
b = 0.001
c = CStr(a * b)
MsgBox c
>こんな計算を行ってみたら、変数に「8.000001E-06」が
>入ってました。なぜなのでしょうか?
情報処理をやってきた者にとっては当たり前のことですが、
(別に情報処理をやってるから偉い訳ではないですがね)
知らない人にとっては理解しがたい問題の一つですね。
簡単に言えばコンピュータが二進数で計算するために起きる「誤差」です。
>そして、どうすれば、正常な計算値がはいるのでしょうか?
誤差を考慮して計算するか、誤差を無くすかしかないです。
前者なら基本的にそのままやってください。
ちなみに「8.000001E-06」というのは
「8.000001 × 10^-6」=「0.000008000001」ってことです。
c = format$( a*b, "0.000000" )
等とすれば必要な有効桁数で結果が得られます。
後者の場合、小数点以下3桁まででいいなら
1000倍して整数にして計算しましょう。
ただしこの場合でも割り算をすれば誤差がでますし、
オーバーフローにも気をつける必要があります。
あともげさんも言ってる通り、
暗黙の型変換(演算結果を直接文字列型変数に入れたりすること)は
極力しない方がいいでしょう。
みなさん回答ありがとうございます!!
情報処理をやってなかったので、、、
対処の仕方を詳しく教えてくださいまして、
ありがとうございました。
ツイート | ![]() |