2016-08-29 2 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

Welcome to StackOverflow! 특정 문제를 명확히하거나 추가 세부 정보를 추가하여 필요한 것을 정확히 강조하십시오. 현재 작성된 내용이므로 귀하가 원하는 내용을 정확하게 말하기는 어렵습니다. 이 질문을 명확히하기위한 [How to Ask] (http://stackoverflow.com/help/how-to-ask) 페이지를 참조하십시오. – slawekwin

+1

'f1.ToString ("R")'을 호출해야합니다. ''R ''옵션은 왕복 안전을 보장합니다. –

답변

3

당신이 f1 및 시계 창에서 f1.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"); 

더 좋은 방법은 무손실입니다 "R" 지정자를 사용하는 것을

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

MSDN : 왕복 ("R") 형식 지정자는 문자열로 변환 된 숫자 값이 동일한 숫자 값으로 다시 구문 분석되도록하는 데 사용됩니다.