プロが教えるわが家の防犯対策術!

以前から思っていたのですが、VBの小数点ってあやしくないですか?
変な現象を見つけたので、知っている方がいたら教えていただきたいのです。

小数点以下、四捨五入をしようと思い、
c = fix(val(a)+val(b))

という、式に対して、a = 20,b = 76.80
と、入れたところ、c = 1536 となるはずなのですが、返ってきた値は
c = 1535 でした。

fixかけてるのに、値が減ってしまうなんてことがあるのでしょうか??
意味不明な現象に戸惑っております。

A 回答 (3件)

FIXは四捨五入ではなく、切り捨てなので、このようなことになります。



VBに限らず、浮動小数点(「NかけるeのM乗」の形で数を表す方式)は、乗除算の際にある程度の誤差を生じます。
Single型の場合、有効桁数は7桁、Double型で15桁です。
で、今回のケースは、この誤差のせいでFixの内側が1535.99999…になってしまっているのでしょう。

で、これをFix関数で変換すると、.9999の部分が切り捨てられて、1535になってしまうわけです。

解決策ですが、一旦、値を通貨型に変換すると良いです。
Fix(Val(20) * CCur(Val(76.8)))
このように書くと、浮動小数点の掛け算ではなく、通貨型の掛け算として扱われるので、計算の誤差が発生しなくなります。

また、変数を宣言するときに、
dim a as Currency, b as Currency
のようにしておき、
a=val("20"): b=val("76.80")
c=fix(a*b)
のようにしても良いです。


小数点以下に厳密さを要求するときは通貨型を使う!!
っていうふうに覚えておくと、この手のトラブルを未然に防ぐことが出来ると思います。
    • good
    • 1
この回答へのお礼

すごーい丁寧に教えてくださって、ありがとうございますっ!

小数型は、doubleか、singleがほとんどで、
かれんしー(英語、長いので略・・・)は、
いまいち使い方がわかりませんでしたー。

これを機にいっぱい調べられて、しかも教えていただいて、
すごく勉強になりました!

本当にありがとうございます!!

お礼日時:2001/06/12 11:26

なるほど掛け算でしたか。


推測できなくてすいませんでした。

回答はARCさんのとおりですから、私は、VBの誤差について書かれたマイクロソフトのページを紹介しておきます。

参考URL:http://www.microsoft.com/mscorp/worldwide/japan/ …
    • good
    • 0
この回答へのお礼

こちらこそー(^^;

ほんと、ごめんなさい。++ありがとうございました!
そっか、microsoftに行けばけっこういろんな情報が集まりますよね。
早速見てみました。

さらに詳しく、知識を深められて、よかったです~!!

ありがとうございました。

お礼日時:2001/06/12 11:29

質問が良くわからないのですが



a = 20
b = 76.80

であれば、

val(a)+val(b)

は、96.8

fixは小数点以下切り捨てなので、96

1535は、どこから出てきた値なのでしょう?

なお、四捨五入は、0.5を加算した値に対して、切り捨てをすれば、OKです。
VB6では、Round関数がありますが、日本での四捨五入とはちょっと違います。
    • good
    • 0
この回答へのお礼

ありがとうございます!+ごめんなさい
急いでかき間違えました。
val(a) * val(b)
の間違えです~(;;
ほんと、ごめんなさい。

私も、0.5を足したり、0.1をたしたり、formatしてみたり、
あと、roundも使ってみたのですが、小数点二桁の切り捨てって、
いつもうまくいかないんです~(vv;

さっそくの回答、ありがとうございますっ。
とってもうれしかったです!

お礼日時:2001/06/11 23:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!