我声明了一个包含4个字节的字节数组。
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);
经过一些转换后,我意识到输出会从
变化{ 0xff, 0xff, 0x7f, 0x7f }
到
{ 0xfD, 0xff, 0x7f, 0x7f }
为什么会这样?
答案 0 :(得分:3)
如果您在观察窗口中查看f1
和f1.ToString()
,您会看到
f1
= 3.40282347E + 38
f1.ToString()
= 3.402823E + 38
这意味着ToString
方法输出表示修剪数字的string
,并且不如4字节float
, 那么准确但是为什么? 强>
默认float.ToString
使用The G
specifier in the standard numeric format strings
,floats
的精确度为7位数。
您可以使用other overload of ToString
指定格式说明符,并为其提供您想要表示的位数:
string s = f1.ToString("G10");
更好的方法是使用无损的"R"
说明符
string s = f1.ToString("R");
MSDN:往返(" R")格式说明符用于确保转换为字符串的数值将被解析回相同的数值。