計算結果を正常に格納するには?

解決


肉大好き  2005-02-17 03:14:16  No: 88456

はじめまして、みなさま。
初めてココにきました。
質問がありまして、解決できるとうれしく思います。
みなさま、宜しくお願いします。

こんな計算を行ってみたら、変数に「8.000001E-06」が
入ってました。なぜなのでしょうか?
そして、どうすれば、正常な計算値がはいるのでしょうか?
教えてください。
<計算>
Dim a As Single
Dim b As Single
Dim c As String

a = 0.008
b = 0.001

c = a * b

宜しくお願いします!!


ガッ  2005-02-17 04:27:35  No: 88457

いや…二進で考えたときには、非常に精度が高い計算かと。
十進で考えたようにしたいときはDecimal型に変換して計算するか、
VBの浮動小数点演算ではなく、自前で装備する必要があるかと。

…最近この手の質問増えてきたなぁ。
※俺は誤差については不得手です、ほかの人のレスを参考にしてみましょう。


もげ  2005-02-17 05:20:24  No: 88458

・浮動小数点型の有効桁数と計算誤差に注意すること。
・暗黙の型変換をやめること。

Dim a As Double
Dim b As Double
Dim c As String

a = 0.008
b = 0.001

c = CStr(a * b)
MsgBox c


通りすがり  2005-02-17 07:45:51  No: 88459

>こんな計算を行ってみたら、変数に「8.000001E-06」が
>入ってました。なぜなのでしょうか?

情報処理をやってきた者にとっては当たり前のことですが、
(別に情報処理をやってるから偉い訳ではないですがね)
知らない人にとっては理解しがたい問題の一つですね。
簡単に言えばコンピュータが二進数で計算するために起きる「誤差」です。

>そして、どうすれば、正常な計算値がはいるのでしょうか?

誤差を考慮して計算するか、誤差を無くすかしかないです。

前者なら基本的にそのままやってください。
ちなみに「8.000001E-06」というのは
「8.000001 × 10^-6」=「0.000008000001」ってことです。
  c = format$( a*b, "0.000000" )
等とすれば必要な有効桁数で結果が得られます。

後者の場合、小数点以下3桁まででいいなら
1000倍して整数にして計算しましょう。
ただしこの場合でも割り算をすれば誤差がでますし、
オーバーフローにも気をつける必要があります。

あともげさんも言ってる通り、
暗黙の型変換(演算結果を直接文字列型変数に入れたりすること)は
極力しない方がいいでしょう。


肉大好き  2005-02-17 21:52:04  No: 88460

みなさん回答ありがとうございます!!
情報処理をやってなかったので、、、
対処の仕方を詳しく教えてくださいまして、
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加