このようなフロートを変換するスマートな方法:
float f = 711989.98f;
精度を失うことなく小数(または倍精度)に変換しますか?
私はもう試した:
decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);
手遅れです。コンパイラで8桁目が失われました。 floatタイプは、有効数字7桁のみを格納できます。コードを書き直す必要があります。もちろん、doubleまたはdecimalに割り当てると、問題は解決します。
有効なfloatは直接小数に変換する必要があるように思われるため、これはコンパイラのバグである可能性があります。しかし、それは解像度を失うことなくしません。 125.609375をfloatからdecimalに変換すると、解像度が失われます。ただし、floatからdoubleに変換してから、doubleからdecimalに変換すると、解像度が維持されます。
float float_val = 125.609375f;
decimal bad_decimal_val = (decimal)float_val; //125.6094
double double_val = (double)float_val;
decimal good_decimal_val = (decimal)double_val;
やってみました?
decimal.TryParse()
http://forums.asp.net/t/1161880.aspx
Float/doubleとdecimalの間には暗黙の変換はありません。暗黙的な数値変換は、精度や大きさを失うことがないことが常に保証されており、例外は発生しません。
711989.98fを書いた瞬間、精度が失われました。
711989.98は10進数です。最後にfを使用すると、コンパイラにfloatに変換するように要求します。この変換は、精度を失うことなく実行できません。
おそらく必要なのは、10進数のd = 711989.98mです。これは精度を失うことはありません。