web-dev-qa-db-ja.com

倍精度変数を10進数にキャストする

これは馬鹿げた質問のように思えるかもしれませんが、通貨として使用するには倍精度を10進数にキャストする必要があります。 Mはどこに行きますか?

decimal dtot = (decimal)(doubleTotal);
68
flo

キャストするときは、数値リテラルにMのみを使用します。

decimal dtot = (decimal)doubleTotal;

浮動小数点数は正確な値を保持するのに適していないことに注意してください。したがって、最初に数値を加算してからDecimalに変換すると、丸めエラーが発生する可能性があります。数値をDecimalに変換してから加算するか、そもそも数値が浮動小数点数でないことを確認してください。

60
Guffa

Mリテラルサフィックスを必要とせずに、doubleをこのように10進数にキャストできます。

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

新しいリテラル10進数値を宣言するときは、Mを使用する必要があります。

decimal dec = 123.45M;

Mがない場合、123.45はdoubleとして扱われ、コンパイルされません。)

28
Chris Fulstow

デフォルトの変換クラスを使用:Convert.ToDecimal(Double)

23
Timur Sadykov
Convert.ToDecimal(the double you are trying to convert);
14
Tom

さて、これは古い質問であり、私は実際にここに示されている答えのいくつかを利用しました。それにもかかわらず、私の特定のシナリオでは、doubleに変換したいdecimal値がdecimal.MaxValueよりも大きいことがしばしばありました。したがって、例外を処理する代わりに、この拡張メソッドを作成しました。

    public static decimal ToDecimal(this double @double) => 
        @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;

上記のアプローチは、オーバーフロー例外の処理を煩わせたくない場合に機能し、そのようなことが発生した場合は、可能な限り最大値を維持したいだけです(私の場合)例外処理が必要になる場合があります。

1
taquion