通貨開発を行うときに使用されるa double
をどのようにキャストしますかdecimal
。どこにM
行くの?
decimal dtot = (decimal)(doubleTotal);
回答:
M
数値リテラルにのみ使用します。キャストするときは次のとおりです。
decimal dtot = (decimal)doubleTotal;
浮動小数点数は正確な値を維持するのに適していないため、最初に数値を加算してから変換すると、Decimal
丸めエラーが発生する可能性があることに注意してください。数値をDecimal
加算する前にに変換するか、最初に数値が浮動小数点数でないことを確認してください。
デフォルトの変換クラスを使用: Convert.ToDecimal(Double)
Convert.ToDecimal(the double you are trying to convert);
double
toに許可するのではなく、プログラマーに2つの変換方法のいずれかを使用するように要求する方が良いでしょう「過剰な」精度をクリップして333333.333333333Dを生成したいが、他の場合では、それを保持して333333.333333333313931Dを生成することもできます。コードは、単に「10進数に変換する」と言うのではなく、変換を実行する方法を指定する必要があります。decimal
double
Convert.ToDecimal(double)
は、使用がと同じであるため、最初のコメントとは実際には無関係のようですが、別のタイプに変更された(decimal)doubleTotal
場合doubleTotal
は、コンパイル時エラーを回避し、ToDecimal が異なるために見つけにくいランタイムエラーが発生する可能性がありますオーバーライドが呼び出される可能性があります。キャスト演算子の方がはるかに明確です...
さて、これは古い質問であり、私は実際にここに示されている回答のいくつかを利用しました。それにもかかわらず、私の特定のシナリオではdouble
、変換したい値decimal
がより大きいことがよくありましたdecimal.MaxValue
。したがって、例外を処理する代わりに、この拡張メソッドを作成しました。
public static decimal ToDecimal(this double @double) =>
@double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
上記のアプローチは、オーバーフロー例外の処理に煩わされたくない場合、およびそのような事態が発生した場合に、可能な最大値(私の場合)を保持したい場合に機能しますが、他の多くのシナリオでは、これは期待される動作ではないことを認識しています例外処理が必要になる可能性があります。