1

許してください、私はこのサイトをあまり使っていません! Visual Basic を使用して Visual Studio で作業しています。Option Strict Off を使用してプロジェクトのプログラミングを終了し、Option Strict をオンにすると、このコードが間違っているという警告が表示されました。

    Const TAX_Decimal As Decimal = 0.07

説明は、「Option Strict On は 'Double' から 'Decimal' への暗黙的な変換を許可しない」というものでした。

しかし、私はそれを小数として宣言したと思っていました! それは私にそれを変更させました:

    Const TAX_Decimal As Decimal = CDec(0.07)

この定数で行った唯一のことは、10 進数で乗算し、10 進数として宣言された変数に保存したことです。

なぜこれが起こっているのか誰か教えてもらえますか?どうもありがとうございました!

4

2 に答える 2

0

コンパイラは、数値リテラルを検出すると、数値、句読点、および接尾辞 (存在する場合) のサイズに基づいて型を選択し、その中の文字列をその型に変換します。これはすべて、コンパイラが数値をどう処理するかに関係なく行われます。これが完了すると、コンパイラは数値を独自の型として使用するか、別の型に明示的にキャストするか、または以下で定義されている 2 つのケースで別の型に暗黙的に変換することのみを許可します。

数値が任意の整数型 ( intlongなど) として解釈される場合、コンパイラは数値を表現できる任意の整数型、および任意の 2 進または 10 進浮動小数点型を初期化するために使用できるようにします。数値がその型で正確に表現できるかどうか。

数値がSingle[f接尾辞で示される] 型である場合、コンパイラは、結果が の初期化に使用されたリテラルを正確に表すDoubleかどうかに関係なく、それを使用して を初期化することを許可します。DoubleSingle

Doubleタイプ[小数点を含むがサフィックスなし] または[「D」サフィックスの直後にプラスまたはマイナスが続かない]タイプの数値リテラルは、数値Decimalが正確に表現可能であっても、他の変数の初期化には使用できません。そうしないと、結果は問題の数値リテラルのターゲット型の最適な表現になります。

Decimalと他の浮動小数点型 (doubleおよびfloat) との間の変換は、変換方法があまり正確ではないため、可能な限り避ける必要があることに注意してください。double正確な表現が存在しない値は多数ありますが、値が値よりも密集Decimalしている広い数値範囲があります。a を変換すると、最も近い値、またはその数値と次に高い値または低い値との間にある値の少なくとも 1 つが選択されると予想されるかもしれませんが、通常の変換方法では必ずしもそうではありません。場合によっては、結果が大幅にずれることがあります。DecimaldoubledoubleDecimalDecimaldouble

に変換DoubleするDecimal必要がある場合は、おそらく何か間違ったことをしている可能性があります。Doubleで利用できて で利用できない操作がいくつかありますがDecimal、2 つの型の間で変換を行うという行為は、Decimal最終的に得られる結果が何であれ、すべての計算が Double` で行われた場合よりも精度が低くなる傾向があることを意味します。

于 2013-08-18T00:02:19.470 に答える