2016-08-29 7 views
2

4バイトを含むバイト配列を宣言しました。 C#float max解析エラー

byte[] bts = new byte[] { 0xff, 0xff, 0x7f, 0x7f };  
float f1 = BitConverter.ToSingle(bts, 0);  
string s = f1.ToString();  
float f2 = float.Parse(s);  
byte[] bts2 = BitConverter.GetBytes(f2); 

は、いくつかの変換の後、私は

{ 0xfD, 0xff, 0x7f, 0x7f } 

{ 0xff, 0xff, 0x7f, 0x7f } 

からの出力変更は、なぜこれが起こったことに気づきましたか?

+0

ようこそStackOverflow!具体的な問題を明確にしたり、詳細を追加して必要なものを正確に強調してください。現在書かれているとおり、あなたが求めていることを正確に伝えるのは難しいです。この質問を明らかにするには、[How to Ask](http://stackoverflow.com/help/how-to-ask)ページを参照してください。 – slawekwin

+1

'f1.ToString(" R ")'を呼び出す必要があります。 '' R ''オプションは往復の安全を保証します。 –

答えて

3

あなたがウォッチウィンドウにf1f1.ToString()を見れば、あなたがその

f1 = 3.40282347E + 38

f1.ToString() = 3.402823E + 38ということを意味

表示されますToStringメソッドは、トリミングされた数値を表すstringを出力し、4バイトのほど正確ではありません、なぜですか?

デフォルトfloat.ToStringfloats 7桁の精度を有するThe G specifier in the standard numeric format stringsを使用します。

あなたは書式指定子を指定し、それをあなたが表現したい桁数の量を提供するためにother overload of ToStringを使用することができます。

string s = f1.ToString("G10"); 

良い方法はロスレス

string s = f1.ToString("R"); 
ある "R"指定子を使用することです

MSDN:往復( "R")書式指定子は、文字列に変換された数値が解析されて同じ数値に戻されるようにするために使用されます。