タイプはどのようにdecimal
実装されていますか?
アップデート
- 128 ビットの値型 (16 バイト) です。
- 1符号ビット
- 仮数部 96 ビット (12 バイト)
- 指数は8ビット
- 残りのビット (23 個!) を 0 に設定
ありがとう!私は、独自の暗黙のスケールで64ビットの長さを使用することに固執します。
ウィキペディアの10 進浮動小数点の記事と、 に関するこの記事への特定のリンクSystem.Decimal
。
厳密には 102 だけが必要ですが、10 進数は 128 ビットで格納されます。小数を、仮数を表す 3 つの 32 ビット整数と、符号と指数を表す 1 つの整数と考えると便利です。最後の整数の最上位ビットは符号ビット (通常の方法で、ビットは負の数に対して設定 (1) されます) であり、ビット 16 ~ 23 (上位 16 ビット ワードの下位ビット) には指数が含まれます。他のビットはすべてクリア (0) にする必要があります。この表現は、4 つの int の配列を返す decimal.GetBits(decimal) によって与えられるものです。
C# 言語仕様から:
この
decimal
型は、金融および通貨の計算に適した 128 ビットのデータ型です。
このdecimal
型は、1.0 × 10 −28から約 7.9 × 10 28の範囲の値を、28 ~ 29 桁の有効数字で表すことができます。type の値の有限集合は
decimal
(–1) s × c × 10 - eの形式です。ここで、符号sは 0 または 1、係数cは 0 ≤ c < 2 96で与えられ、スケールeは次のとおりです。 0 ≤ e ≤ 28となります。
このdecimal
型は、符号付きゼロ、無限大、または NaN をサポートしていません。Adecimal
は、10 のべき乗でスケーリングされた 96 ビット整数として表されます。絶対値が 1.0m 未満の小数の場合、値は小数点以下 28位まで正確ですが、それ以上ではありません。絶対値が 1.0m 以上の 10 進数の場合、値は正確に 28 桁または 29 桁です。
float
およびデータ型とは対照的に、double
0.1 などの 10 進数の小数は、10 進数表現で正確に表すことができます。float
および表現ではdouble
、このような数値はしばしば無限小数であり、これらの表現は丸め誤差を起こしやすくなります。二項演算子のオペランドの 1 つが 型の場合、もう 1 つのオペランドは
decimal
整数型または型でなければなりませんdecimal
。整数型オペランドが存在する場合はdecimal
、演算が実行される前に変換されます。型の値に対する操作の結果は
decimal
、正確な結果を計算し (各演算子で定義されているようにスケールを保持)、表現に合わせて丸めた結果となります。結果は最も近い表現可能な値に丸められ、結果が 2 つの表現可能な値に等しく近い場合は、最下位桁位置が偶数である値に丸められます (これは「バンカーの丸め」として知られています)。ゼロの結果には、常に符号 0 と位取り 0 があります。10 進算術演算で生成される値が絶対値で5 × 10 -29以下の場合、演算の結果はゼロになります。10 進算術演算の結果が
decimal
フォーマットに対して大きすぎる場合、 aSystem.OverflowException
がスローされます。この
decimal
型は、浮動小数点型よりも精度が高くなりますが、範囲が狭くなります。したがって、浮動小数点型decimal
から への変換ではオーバーフロー例外が発生する可能性があり、 から浮動小数点型への変換decimal
では精度が失われる可能性があります。これらの理由により、浮動小数点型 と の間に暗黙的な変換は存在decimal
せず、明示的なキャストがなければ、同じ式で浮動小数点とdecimal
オペランドを混在させることはできません。
http://msdn.microsoft.com/en-us/library/system.decimal(VS.80).aspxの MSDN の 10 進数構造ページで説明されているように:
Decimal 値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および 96 ビットの整数を除算し、小数部分を指定するために使用されるスケーリング係数で構成されます。倍率は暗黙的に 10 を 0 ~ 28 の範囲の指数で累乗したものです。したがって、10 進値のバイナリ表現は ((-296 ~ 296) / 10(0 ~ 28)) の形式になります。 -296-1 は MinValue に等しく、296-1 は MaxValue に等しくなります。
スケーリング係数は、10 進数の末尾のゼロも保持します。末尾のゼロは、算術演算または比較演算の 10 進数の値には影響しません。ただし、適切な書式文字列が適用されている場合は、ToString メソッドによって末尾のゼロを明らかにすることができます。
J.Richter による「C# 経由の CLR」第 3 版から:
丸め誤差が許容されない財務計算に一般的に使用される 128 ビットの高精度浮動小数点値。128 ビットのうち、1 ビットは値の符号を表し、96 ビットは値自体を表し、8 ビットは 96 ビット値を除算するための 10 の累乗を表します (0 から 28 のいずれか)。残りのビットは未使用です。
decimal キーワードは、128 ビットのデータ型を示します。
Decimal 値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および 96 ビットの整数を除算し、小数部分を指定するために使用されるスケーリング係数で構成されます。倍率は暗黙的に 10 を 0 ~ 28 の範囲の指数で累乗したものです。したがって、10 進値のバイナリ表現は ((-296 ~ 296) / 10(0 ~ 28)) の形式になります。 -296-1 は MinValue に等しく、296-1 は MaxValue に等しくなります。
decimal 型は浮動小数点数の別の形式ですが、float や double とは異なり、基数は 10 です。
簡単な説明はこちらhttp://csharpindepth.com/Articles/General/Decimal.aspx