数字の小数部分だけを取得するエレガントな方法を知っている人はいますか?特に、小数点以下の正確な桁数を取得して、数値を適切にフォーマットできるようにすることを目指しています。カルチャ固有の小数点記号を使用して文字列を抽出せずにこれを行う方法はないかと思いました。
たとえば、
98.0は98としてフォーマットされます。98.20は
98.2として
フォーマットされます。98.2765は98.2765としてフォーマットされます。
それは書式設定のみを目的ToString
としており、呼び出すだけでうまくいくと思いますか?
double d = (double)5 / 4;
Console.WriteLine(d.ToString()); // prints 1.75
d = (double)7 / 2;
Console.WriteLine(d.ToString()); // prints 3.5
d = 7;
Console.WriteLine(d.ToString()); // prints 7
もちろん、これは現在のカルチャに従って数値をフォーマットします (つまり、小数点記号、桁区切り記号などが異なることを意味します)。
アップデート
Clement H がコメントで指摘しているように。大きな数を扱っている場合、ある時点で d.ToString() は科学的な書式設定の文字列を返します ( の"1E+16"
代わりになど"10000000000000000"
)。この問題を克服し、完全な数値を強制的に出力する 1 つの方法は、 を使用することd.ToString("0.#")
です。これにより、上記のコード サンプルが生成するのと同じ出力が、より低い数値に対しても得られます。
あなたが本当に意味していると仮定すると、 Decimal.GetBitsメソッドからすべての関連情報を取得できますSystem.Decimal
。(float / doubleの10進形式について話している場合は、質問を明確にしてください。)
基本的GetBits
に、配列内の4つの整数を返します。
スケーリング係数(符号をマスクした後の4番目の整数)を使用して小数点以下の桁数を示すことができますが、必ずしも小数点以下の桁数ではないことに注意してください。特に、1と1.0の10進表現は異なります(前者は1/1、後者は10/10です)。
残念ながら、.NET 4.0およびを使用できない限り、96ビット整数を操作するには面倒な計算が必要になりBigInteger
ます。
正直なところ、組み込みの書式設定を使用して、「。」の右側にあるすべてのものを見つけることで、より簡単な解決策が得られます。CultureInfo.InvariantCulture
getbits についてさらに詳しく説明すると、この式は foo と呼ばれる 10 進数から倍率を取得します。
(decimal.GetBits(foo)[3] & 16711680)>>16
Int() 関数を使用して整数コンポーネントを取得し、元から減算することができます。