ここにも同様の質問があります。数が多すぎる可能性があるため、そのソリューションで例外が発生することがあります。
10進数のバイトを見る方法があればもっと効率的だと思います。たとえば、10進数はnバイト数で表す必要があります。たとえば、Int32は32ビットで表され、1のビットで始まるすべての数値は負です。たぶん、10進数とある種の同様の関係があります。10進数のバイトをどのように見ることができますか?または整数のバイト?
(浮動小数点数ではなく)実際に10進数について話している場合は、Decimal.GetBitsを使用して10進数の個々のビットを確認できます。MSDNページには、ビットの意味の説明も含まれています。
一方、数値に小数部分があるかどうかを確認したいだけの場合は、単純な
var hasFractionalPart = (myValue - Math.Round(myValue) != 0)
バイナリ構造をデコードするよりもはるかに簡単です。これは、小数だけでなく、 floatやdoubleなどの従来の浮動小数点データ型でも機能するはずです。後者の場合、浮動小数点の丸め誤差のためMath.Abs(myValue - Math.Round(myValue)) < someThreshold
に、と比較する代わりにチェックする方が理にかなっている場合があり0
ます。
型の「10進数」値を取得するための合理的に効率的な方法が必要な場合は、decimal
1つだけ変更できます。
decimal number = 4.75M;
decimal fractionalPart = number % 1;
Console.WriteLine(fractionalPart); //will print 0.75
理論的には最適なソリューションではないかもしれませんが、非常に高速であり、ほぼ確実に目的に十分な速度です(一般的な単純なアプローチである文字列の操作と解析よりもはるかに優れています)。
Decimal.GetBits
10進構造からビットを取得するために使用できます。
上記のリンク先のMSDNページでは、メモリ内での配置方法について詳しく説明しています。
10進数の2進表現は、1ビットの符号、96ビットの整数、および整数を除算してその小数部を指定するために使用されるスケーリング係数で構成されます。スケーリング係数は暗黙的に数値10であり、0から28の範囲の指数になります。
戻り値は、32ビットの符号付き整数の4要素配列です。
返される配列の1番目、2番目、および3番目の要素には、96ビット整数の下位32ビット、中間32ビット、および上位32ビットが含まれます。
返される配列の4番目の要素には、スケール係数と符号が含まれています。次の部分で構成されています。
下位ワードのビット0〜15は未使用であり、ゼロでなければなりません。
ビット16〜23には、0〜28の指数が含まれている必要があります。これは、整数を除算するための10の累乗を示します。
ビット24〜30は未使用であり、ゼロである必要があります。
ビット31には符号が含まれています。0は正を意味し、1は負を意味します。
GetBitsを使用するためのOdedの詳細情報を参考にして、私はこれを思いつきました
const int EXP_MASK = 0x00FF0000;
bool hasDecimal = (Decimal.GetBits(value)[3] & EXP_MASK) != 0x0;