はじめましてこんにちは。
当方、小数点つきの値を変数へ積算させたいんですが
たとえば、下記のコードを実行すると積算後の変数に誤差がでます。
ですが、最近CDec関数をはさむと誤差がなくなる?ということをインターネットで知りました。
このCDec関数はこのように使うと浮動小数の変数なのに誤差がなくなるような関数なのでしょうか?
Private Sub Form_Load()
Dim dblBuf As Double
Dim dblCdec As Double
Dim l As Long
dblBuf = 0
dblCdec = 0
For l = 1 To 1000000
dblBuf = dblBuf + 0.000001
dblCdec = CDec(dblCdec + 0.000001)
Next l
MsgBox "dblBuf:" & dblBuf & vbCrLf & "dblCdec" & dblCdec
End Sub
dblBuf=1.00000000000792
dblCdec=1
よろしくお願いします。
> 変数に誤差がでます。
Double 型を使っていますからね。
浮動小数点数による誤差の概要については、下記を参照。
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0#.E6.B5.AE.E5.8B.95.E5.B0.8F.E6.95.B0.E7.82.B9.E6.95.B0.E3.81.AE.E7.B2.BE.E5.BA.A6
誤差を含めたくないなら、通貨型か、10進型か、整数型を使う必要があります。
(通貨型は、内部的には 64bit整数型として扱われています)
> ですが、最近CDec関数をはさむと誤差がなくなる?ということをインターネットで知りました。
微妙に勘違いがあるかも。
途中の演算も含め、終始 10 進型のみで処理するのであれば良いのですが、
値を保持する変数や、その演算自体を浮動小数で処理しておいて、その一部だけを
CDec で 10 進型に変化させたとて、誤差を無くすことはできません。
浮動小数に、0.000001 という 10進数値を誤差なく格納させる事はできませんからね。
(0.000005 ならば、浮動小数でも誤差なく格納できるでしょうけれども)
> 浮動小数の変数なのに誤差がなくなるような関数なのでしょうか?
もちろん無理です。せいぜい、誤差が減ったように見せかけるという程度かと。
そもそも CDec を使ったとて、誤差を完全になくすことはできませんよね。(10÷3など)
魔界の仮面弁士 様ありがとうございます。
いかに誤差を少なくするかがポイントになると言うことですね。
丁寧に教えていただきまして、とても分かりやすかったです。ありがとうございました。
解決しました。
| ツイート |
|