2016-07-21 9 views
1

私はワークシート内のセルに関連する倍精度を使用して非常に正確な計算をしようとしています。コードをデバッグするとき、テストダブルとしてのみ-3298.86を拾っていることは明らかですが...£3,298.8599993 - J2は10進値ですセルでExcel VBAの二重丸め

Sub MacroTest() 

Dim opt As Worksheet 
Set opt = Sheets("Optimisation") 

Dim test As Double 

test = CDec(opt.Cells(2, 10)) 

End Sub 

:私はテストとして、私は次のコードを書きました値。私はダブルスがこれよりも正確だと思ったので、なぜこれがなろうとしているのか理解できません。私が読んだ記事のほとんどは、CDecを使ってこの問題を解決しなければならないと考えているようですが、これは私にとってはうまくいかないようです。

注 - J2の値は数式を使用して計算されていますが、これは違いがあるかどうかはわかりません。どんな助けでも大歓迎です - ありがとう。

+0

は、ポイントの後にあなたがしたい桁数を表示するようにフォーマットされた 'セルJ2'です。 ? –

+0

@ShaiRado Cell J2は現在、小数点第7位を表示するように書式設定されています –

答えて

3

この場合、opt.Cells(2, 10).Value2を使用してください。 Range.Value2 property

このプロパティとValueプロパティの唯一の違いは、Value2プロパティは、通貨および日付のデータ型を使用しないこと です。 Doubleデータ型を使用して、これらのデータ型でフォーマットされた値を 浮動小数点数として返すことができます。

.Value2が、それにもかかわらずDoubleを返します。一方、セルが通貨としてフォーマットされているのであれば、デフォルト.ValueCurrencyを返します。

0

私はまだコメントが、ここにあなたのコードに問題があるものですができません。

あなたは二重のデータ型のCDEC-変換式を使用しており、この機能からの結果は、二重に入れられます-datatypeをもう一度入力します。だから、ここで正確なものは得られません。

でVBAのdecimal-datatypeを使用できますが、ダブルデータ型を使用してもよろしいですか?

私の例では、セル「A1」に10進数3298.859999が含まれています。小数点データ型に、変数の

Dim varDec As Variant 
varDec = CDec(Range("A1").Value2) 

Debug.Print "Value in A1 : " & Format(varDec, "0.0000000000000000000000") 

直接鋳造は、VBAでは不可能ですが、バリアント・データ型は、サブタイプとして小数点データ型を持っています。

これを自分で確認するには、デバッグ中にVBEの「ローカル」ウィンドウを見てください。これは、表示されます:

Expression : var 
Value  : 3298.859999 
Type  : Variant/Decimal 

Background article on Excel numeric precision

関連する問題