• ベストアンサー

VBの小数点周り

以前から思っていたのですが、VBの小数点ってあやしくないですか? 変な現象を見つけたので、知っている方がいたら教えていただきたいのです。 小数点以下、四捨五入をしようと思い、 c = fix(val(a)+val(b)) という、式に対して、a = 20,b = 76.80 と、入れたところ、c = 1536 となるはずなのですが、返ってきた値は c = 1535 でした。 fixかけてるのに、値が減ってしまうなんてことがあるのでしょうか?? 意味不明な現象に戸惑っております。

質問者が選んだベストアンサー

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

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) のようにしても良いです。 小数点以下に厳密さを要求するときは通貨型を使う!! っていうふうに覚えておくと、この手のトラブルを未然に防ぐことが出来ると思います。

kirin3
質問者

お礼

すごーい丁寧に教えてくださって、ありがとうございますっ! 小数型は、doubleか、singleがほとんどで、 かれんしー(英語、長いので略・・・)は、 いまいち使い方がわかりませんでしたー。 これを機にいっぱい調べられて、しかも教えていただいて、 すごく勉強になりました! 本当にありがとうございます!!

その他の回答 (2)

  • arata
  • ベストアンサー率49% (139/279)
回答No.3

なるほど掛け算でしたか。 推測できなくてすいませんでした。 回答はARCさんのとおりですから、私は、VBの誤差について書かれたマイクロソフトのページを紹介しておきます。

参考URL:
http://www.microsoft.com/mscorp/worldwide/japan/support/kb/articles/j029/9/74.htm
kirin3
質問者

お礼

こちらこそー(^^; ほんと、ごめんなさい。++ありがとうございました! そっか、microsoftに行けばけっこういろんな情報が集まりますよね。 早速見てみました。 さらに詳しく、知識を深められて、よかったです~!! ありがとうございました。

  • arata
  • ベストアンサー率49% (139/279)
回答No.1

質問が良くわからないのですが a = 20 b = 76.80 であれば、 val(a)+val(b) は、96.8 fixは小数点以下切り捨てなので、96 1535は、どこから出てきた値なのでしょう? なお、四捨五入は、0.5を加算した値に対して、切り捨てをすれば、OKです。 VB6では、Round関数がありますが、日本での四捨五入とはちょっと違います。

kirin3
質問者

お礼

ありがとうございます!+ごめんなさい 急いでかき間違えました。 val(a) * val(b) の間違えです~(;; ほんと、ごめんなさい。 私も、0.5を足したり、0.1をたしたり、formatしてみたり、 あと、roundも使ってみたのですが、小数点二桁の切り捨てって、 いつもうまくいかないんです~(vv; さっそくの回答、ありがとうございますっ。 とってもうれしかったです!

関連するQ&A