次の方法で共有


10 進型 (Decimal) (Visual Basic)

可変の 10 の累乗によってスケーリングされた 96 ビット (12 バイト) 整数値を表す符号付き 128 ビット (16 バイト) 値を保持します。 スケール ファクターは小数点以下の桁数を指定し、0 から 28 の範囲になります。 0 のスケール (小数点以下の桁数なし) では、有効な最大値は +/-79,228,162,514,264,337,593,543,950,335 (+/-7.9228162514264337593543950335E+28) です。 28 桁の小数点以下の桁数では、最大値は +/-7.9228162514264337593543950335 で、0 以外の最小値は +/-0.0000000000000000000000000001 (+/-1E-28) になります。

Remarks

Decimal データ型は、数値の最大有効桁数を提供します。 最大 29 桁の有効桁数をサポートし、7.9228 x 10^28 を超える値を表すことができます。 これは、多くの桁数を必要とするが丸め誤差を許容できない財務などの計算に特に適しています。

Decimal の既定値は 0 です。

プログラミングのヒント

  • 精度:Decimal は浮動小数点データ型ではありません。 Decimal 構造体は、2 進数の整数値を保持します。符号ビットと、値のどの部分が小数であるかを指定する整数のスケーリング ファクターです。 このため、Decimal の数値は、浮動小数点型 (SingleDouble) よりもメモリ内でより正確に表現されます。

  • パフォーマンス。 Decimal データ型は、すべての数値型の中で最も低速です。 データ型を選択する前に、精度の重要性をパフォーマンスに照らして検討する必要があります。

  • 拡大変換。 Decimal データ型は、System.OverflowException エラーが発生することなく、Single または Double に変換できます。 ただし、SingleDouble では精度の維持よりも大きな値の対応が優先されるため、この変換によって精度の低下が発生する可能性があります。

Dim decimalValue As Decimal = 1234567890123456789012345D
Dim doubleValue As Double = CDbl(decimalValue)

Console.WriteLine("Decimal value: " & decimalValue)
Console.WriteLine("Double value: " & doubleValue)

前の例の出力は、Decimal 値 が完全な有効桁数を保持しているのに対し、Double 値Double データ型の制限により有効桁数が失われることを示しています。

 Decimal value: 1234567890123456789012345
 Double value: 1.23456789012346E+24
  • 末尾のゼロ。 Visual Basic では、末尾のゼロが Decimal リテラルに格納されません。 ただし、Decimal 変数では、計算によって取得されたすべての末尾のゼロが保持されます。 次に例を示します。

    Dim d1, d2, d3, d4 As Decimal
    d1 = 2.375D
    d2 = 1.625D
    d3 = d1 + d2
    d4 = 4.000D
    MsgBox("d1 = " & CStr(d1) & ", d2 = " & CStr(d2) &
          ", d3 = " & CStr(d3) & ", d4 = " & CStr(d4))
    

    前の例の MsgBox の出力は次のようになります。

    d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4
    
  • 型宣言文字。 あるリテラルにリテラルの型文字 D を付けると、そのリテラルは Decimal に変換されます。 ある識別子に識別子の型文字 @ を付けると、その識別子は整数型 (Decimal) に変換されます。

  • Framework のデータ型 .NET Framework において対応する型は、System.Decimal 構造体です。

範囲

D 変数または定数に大きな値を代入するために、Decimal 型文字を使用する必要がある場合があります。 この要件は、次の例に示すように、リテラルの型文字がリテラルの後に続く場合を除いて、コンパイラではリテラルが Long として解釈されるためです。

Dim bigDec1 As Decimal = 9223372036854775807   ' No overflow.
Dim bigDec2 As Decimal = 9223372036854775808   ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D  ' No overflow.

それに代入される値は bigDec1 の範囲に収まるため、Long の宣言でオーバーフローが発生しません。 Long 値は Decimal 変数に代入することができます。

bigDec2 の宣言で、オーバーフロー エラーが発生するのは、それに代入された値が Long に対して大きすぎるためです。 数値リテラルは最初に Long として解釈できないため、Decimal 変数に代入できません。

bigDec3 の場合、リテラルの型文字 D で、コンパイラにリテラルを Decimal ではなく Long として強制的に解釈させることによって、問題を解決します。

関連項目