为什么字符串和浮点值之间的转换是错误的

本文关键字:转换 错误 之间 字符串 为什么 | 更新日期: 2023-09-27 18:24:04

请参阅下面的示例。

float maxFloat = float.MaxValue;
string s = maxFloat.ToString();
float result = float.Parse(s); // same with Convert.ToSingle(s);
bool mustEqual = (maxFloat == result);
// It returns FALSE, why?

为什么字符串和浮点值之间的转换是错误的

您应该使用"R"格式字符串:

https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx.

https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx#RFormatString

"R"或"R"往返结果:可以往返于相同的数字。支持:Single、Double和BigInteger。精度说明符:已忽略。

  float maxFloat = float.MaxValue;
  string s = maxFloat.ToString("R"); // <- "R"
  float result = float.Parse(s);
  bool mustEqual = (maxFloat == result);

// It returns FALSE, why?

因为默认情况下float.ToString()输出7位精度数字,所以您的值为3.40282347E+38(9位精度)的float.MaxValue将四舍五入为3.402823E+38,您的检查当然会因为3.402823E+38 != 3.40282347E+38而失败。

如果显式指定格式说明符以9位精度输出float.MaxValue,例如float.MaxValue.ToString("G9"),则检查将成功。