2

「UpperRangeHigh」と「UpperRangeLow」という名前の 2 つのセルにユーザー入力があります。次のコードがあります。

dRangeUpper = [UpperRangeHigh] - [UpperRangeLow]
lLines = Int(dRangeUpper * 100 / lInterval)

ユーザーは、入力セルにそれぞれ 120.3 と 120 を入力します。lInterval の値は 10 です。VBA は lLines に対して 3 ではなく 2 の結果を生成します。

dRangeUpper に 0.000000001 を追加することでこの問題を解決できますが、この動作に既知の理由があるかどうか疑問に思っています。

4

3 に答える 3

4

これは、Excel の計算と有効数字に問題があるようです。もしあなたがそうするなら:

=120.3 - 120小数点以下 15 桁を表示するようにセルをフォーマットすると、結果は次のように表示されます。

0.2999999999999970

以下は、Excel が 2 進演算を使用する方法と、これにより予想とは異なる結果になる可能性があることを説明する簡単な概要です。

http://excel.tips.net/T008143_Avoiding_Rounding_Errors_in_Formula_Results.html

これは、小数点以下 10 桁などに丸め精度を強制することで克服できます。

lLines = Int(Round(dRangeUpper, 10) * 100 / lInterval

于 2013-03-22T14:09:09.960 に答える
3

より正確な結果を得るために、10 進数を扱う場合は、single または double を使用してください。

Sub sample()
    Dim dRangeUpper As Double
    dRangeUpper = CDbl("120.3") - CDbl("120")
    lLines = Round(CDbl(dRangeUpper * 100 / 10), 4)
End Sub

出力 = 3

ここに画像の説明を入力

于 2013-03-22T14:27:32.100 に答える
0

これは、Excel 内の既知の浮動小数点の問題です。

http://support.microsoft.com/kb/78113

MSDN から:

浮動小数点演算の不正確な格納による影響を最小限に抑えるには、Round() 関数を使用して、計算に必要な小数点以下の桁数に数値を丸めます。たとえば、通貨を扱っている場合は、小数点以下 2 桁に丸める可能性があります。

=ROUND(1*(0.5-0.4-0.1),2)

あなたの場合、INT の代わりに round() を使用すると、2 ではなく 0 を使用してトリックを行う必要があります

于 2013-03-22T15:05:06.080 に答える