これは馬鹿げた質問のように思えるかもしれませんが、通貨として使用するには倍精度を10進数にキャストする必要があります。 Mはどこに行きますか?
decimal dtot = (decimal)(doubleTotal);
キャストするときは、数値リテラルにM
のみを使用します。
decimal dtot = (decimal)doubleTotal;
浮動小数点数は正確な値を保持するのに適していないことに注意してください。したがって、最初に数値を加算してからDecimal
に変換すると、丸めエラーが発生する可能性があります。数値をDecimal
に変換してから加算するか、そもそも数値が浮動小数点数でないことを確認してください。
M
リテラルサフィックスを必要とせずに、doubleをこのように10進数にキャストできます。
double dbl = 1.2345D;
decimal dec = (decimal) dbl;
新しいリテラル10進数値を宣言するときは、M
を使用する必要があります。
decimal dec = 123.45M;
(M
がない場合、123.45はdoubleとして扱われ、コンパイルされません。)
デフォルトの変換クラスを使用:Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
さて、これは古い質問であり、私は実際にここに示されている答えのいくつかを利用しました。それにもかかわらず、私の特定のシナリオでは、double
に変換したいdecimal
値がdecimal.MaxValue
よりも大きいことがしばしばありました。したがって、例外を処理する代わりに、この拡張メソッドを作成しました。
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
上記のアプローチは、オーバーフロー例外の処理を煩わせたくない場合に機能し、そのようなことが発生した場合は、可能な限り最大値を維持したいだけです(私の場合)例外処理が必要になる場合があります。