2011-09-07 12 views
6

私はVBAでこのあいまいな丸め問題を抱えています。VBA丸め問題

a = 61048.4599674847 
b = 154553063.208822 
c = a + b 
debug.print c 
Result: 
154614111.66879 

ここで、なぜVBAは変数cを四捨五入しましたか?私は機能を四捨五入しなかった。私が期待していた価値は154614111.6687894847でした。変数cを小数点以下15桁まで四捨五入しても、私はまだ期待通りの結果を得られません。

いずれの説明も理解できます。

編集:

cDecを使用して期待される結果を得ました。

a = cDec(61048.4599674847) 
b = cDec(154553063.208822) 
c = a + b 
?c 
154614111.6687894847 
+1

することができる変数の異なるタイプ(10進数)に変換しているCDECを行うことにより

[浮動小数点演算は、Excelで不正確な結果を与えることができる(http://support.microsoft .com/kb/78113) – SeanC

答えて

11

理由は、浮動小数点変数に格納することができます限らprecissionです:私は、テストの結果であり、ここでWhy does CLng produce different results?

でジョナサン・アレンの回答でこれを読んだことがあります。
完全な説明については、コンピューティングアンケートの1991年3月号に掲載されているDavid Goldbergによる、浮動小数点演算について各コンピュータ科学者が知っておくべきこと VBAで

Link to paper

デフォルトの浮動小数点タイプは、IEEE 64ビット(8バイト)の浮動小数点数であるDoubleあります。利用可能な別の種類あり

Decimal 96ビット(12バイト)であり、簡単に言えば10
の可変電源によってスケーリング符号付き整数は、これは28桁precissionに浮動小数点数を提供します。

あなたの例で使用するには:

a = CDec(61048.4599674847) 
b = CDec(154553063.208822) 
c = a + b 
debug.print c 
Result: 
154614111.6687894847 
+0

リンクありがとうございます。 – Grekoz

3

その曖昧ではないが、その必ずしも明らかではありません。

私はあなたに答えていると思いますが、基本的な問題は、あるタイプの変数にどれだけのデータを格納できるかという値の「サイズ」の1つです。

最初の例で各数字の桁数をカウントすると、15があることがわかりますが、float(デフォルトタイプ)が表すことができる値の範囲精度は15桁に制限されています(私は誰かがこれを修正するために一緒になると確信しています、私はwikiボックスにチェックを入れます...)

したがって、2つの数字を一緒に追加すると、フローの許容可能な精度内にとどまるように値を設定します。あなたがより高い精度