2016-11-08 16 views
1

要するに、以下のToString()の行が私の期待に合わない理由は不思議です。C#float文字列フォーマットの理解に役立つ

float actual = 111253.469F; 
double rounded = Math.Round(actual, 2); // 111253.47 (expected) 
string stringified = actual.ToString(); // 111253.50 (expected 111253.469) 
string currency = actual.ToString("C"); // $111253.50 (expected 111253.47 or possibly .46) 

誰かが何が起こっているのか説明できますか?

注:浮動小数点数のその他の質問については、浮動小数点値は正確ではありません。しかし、私は問題の浮動小数点数の文字列値を反映するように文字列出力を期待しています。

この場合、クイックウォッチでブレークポイントを設定して 'actual'の値を見ると '111253.5'と表示されず、 '111253.469'と表示されます。私はそれがなぜ印刷されないのか理解できません。特に通貨の場合は、他のリテラル値を選択するのではなく、適切な小数点に丸めて表示することを期待しています。これは数学的な問題ではなく、ToString()の動作に関する質問です。

編集:以下 パーQuanticのさんのコメント、ToStringがここで見られる数で、その結果、7桁の数を制限し、デフォルトでG形式を使用して表示されます。 MSDN about Single.ToString()(強調鉱山)によれば

+2

不可能。 111253は決して出力として11253を与えません –

+0

@ThomasWeller申し訳ありませんが、私のコメント行は不正確です(最初の1文字は削除されました)が、私を投げている小数点です。私は訂正します。 – SWC

+0

小数点2桁の数値を使用する場合は、次のサンプルを使用できます。ToString( "0.00"); ToString( "n2"); //番号の場合 ToString( "c2"); //通貨の場合 – tdog

答えて

1

デフォルトでは、9桁の最大値が内部に維持されるが、戻り値は、精度の7桁の数字を含んでいます。このインスタンスの値が7桁を超える場合、M:System.Single.ToString(System.String)は、期待される数値の代わりにP:System.Globalization.NumberFormatInfo.PositiveInfinitySymbolまたはP:System.Globalization.NumberFormatInfo.NegativeInfinitySymbolを返します。 さらに精度が必要な場合は、常に9桁の精度を返す "G9"形式指定、またはその精度で数値を表すことができる場合は7桁を、 "R"の場合は9桁を返します。最大精度はで表されます。

だからあなたのコード例では、文書化とまったく同じように動作します。

  • ToString()も精度の7桁
を使用します
  • ToString("C") 7桁の精度を使用します。これは、デフォルトで"G"を使用します。

    "R""G9"の両方が返されます。111253.469"G8"返信s 111253.47

  • 0

    ToString()問題がない場合、floatという問題があります。

    floatは、定義により、7桁の精度を持っていることを浮動小数点値である:MSDN

    は今、あなたは以上の7桁持っている:float actual = 111253.469Fを、そのシステムは、最下位のものを丸め、あなたが111253.5を取得しますあなたの操作の結果としてdoubleは、7桁を超える有効数字を処理できるため、正しく計算されます。

    関連する問題