web-dev-qa-db-ja.com

C#フロートから10進数への変換

このようなフロートを変換するスマートな方法:

float f = 711989.98f;

精度を失うことなく小数(または倍精度)に変換しますか?

私はもう試した:

decimal d = (decimal)f;
decimal d1 = (decimal)(Math.Round(f,2));
decimal d2 = Convert.ToDecimal(f);
13
Adrian4B

手遅れです。コンパイラで8桁目が失われました。 floatタイプは、有効数字7桁のみを格納できます。コードを書き直す必要があります。もちろん、doubleまたはdecimalに割り当てると、問題は解決します。

14
Hans Passant

有効な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;
3
John

やってみました?

decimal.TryParse()

http://forums.asp.net/t/1161880.aspx

Float/doubleとdecimalの間には暗黙の変換はありません。暗黙的な数値変換は、精度や大きさを失うことがないことが常に保証されており、例外は発生しません。

1
hunter

711989.98fを書いた瞬間、精度が失われました。

711989.98は10進数です。最後にfを使用すると、コンパイラにfloatに変換するように要求します。この変換は、精度を失うことなく実行できません。

おそらく必要なのは、10進数のd = 711989.98mです。これは精度を失うことはありません。

1
mfeingold