VBまたはC#の「10進数」値の内部形式は何ですか?
これが私がすぐにやっていることにとって重要かどうかはわかりませんが、知っておくとよいことの1つです。たとえば、ビット数と負の数がどのように格納されているかを知ることは、正の数を期待した場所に負の数が表示されるのを見ると、深く暗い謎に悩まされるのではなく、すぐに「あふれました」と考えることができることを意味します。 。
あなたの質問への回答は、ドキュメントによって完全なテクニカラーで提供されています。
Decimal 値型は、正の 79,228,162,514,264,337,593,543,950,335 から負の 79,228,162,514,264,337,593,543,950,335 までの範囲の 10 進数を表します。Decimal 値タイプは、多数の有効な整数桁と小数桁を必要とし、丸め誤差がない財務計算に適しています。Decimal 型では、丸めが不要になるわけではありません。むしろ、丸めによるエラーを最小限に抑えます。
10 進数は、符号、値の各桁の範囲が 0 ~ 9 の数値、および整数部分と小数部分を区切る浮動小数点の位置を示すスケーリング係数で構成される浮動小数点値です。数値の。
Decimal 値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および 96 ビットの整数を除算し、小数部分を指定するために使用されるスケーリング係数で構成されます。倍率は、暗黙的に 10 を 0 から 28 の範囲の指数で累乗したものです。したがって、10 進値のバイナリ表現は、((-2 96から 2 96 ) / 10 (0 から 28) )の形式になります。ここで、-2 96 -1 は MinValue に等しく、2 96 -1 は MaxValue に等しくなります。Decimal 値のバイナリ表現と例の詳細については、Decimal(Int32[])コンストラクターとGetBitsメソッドを参照してください。
スケーリング係数は、10 進数の末尾のゼロも保持します。末尾のゼロは、算術演算または比較演算の 10 進数の値には影響しません。ただし、適切な書式文字列が適用されている場合は、ToString メソッドによって末尾のゼロを明らかにすることができます。
のドキュメントで説明されているように、バイナリ表現GetBits
:
10 進数の 2 進数表現は、1 ビットの符号、96 ビットの整数、および整数を除算し、小数部分を指定するために使用される倍率で構成されます。倍率は、暗黙的に 10 を 0 から 28 までの指数で累乗したものです。
戻り値は、32 ビット符号付き整数の 4 つの要素の配列です。
返された配列の 1 番目、2 番目、3 番目の要素には、96 ビット整数の下位、中間、および上位 32 ビットが含まれます。
返された配列の 4 番目の要素には、倍率と符号が含まれます。次の部分で構成されています。
下位ワードであるビット 0 ~ 15 は未使用であり、0 でなければなりません。
ビット 16 ~ 23 には、0 ~ 28 の指数が含まれている必要があります。これは、整数を除算する 10 の累乗を示します。
ビット 24 ~ 30 は未使用であり、0 でなければなりません。
ビット 31 には符号が含まれます。0 は正を意味し、1 は負を意味します。
ビット表現は、負のゼロと正のゼロを区別することに注意してください。これらの値は、すべての操作で等しいものとして扱われます。
c# と VB.NET の両方がdecimal
を参照してSystem.Decimal
おり、十分に文書化されています: System.Decimal
decimal キーワードは、128 ビットのデータ型を示します。浮動小数点型と比較して、10 進数型は精度が高く、範囲が狭いため、金融および通貨の計算に適しています。次の表に、decimal 型のおおよその範囲と精度を示します。
範囲: ±1.0 × 10−28 ~ ±7.9 × 1028 精度: 有効桁数 28 ~ 29 桁
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.00000000000000000000000001 (+/-1E-28) です。