Подтвердить что ты не робот

Почему конвертирование между строкой и поплавком неверно?

Пожалуйста, смотрите мой пример ниже.

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?
4b9b3361

Ответ 1

Вы должны использовать строку формата "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);

Ответ 2

// It returns FALSE, why?

Поскольку float.ToString() выводит 7-значный префиксный номер по умолчанию, поэтому ваш float.MaxValue, который имеет значение 3.40282347E+38 (9-значная точность), округляется до 3.402823E+38, и ваш чек терпит неудачу из-за того, что, конечно, 3.402823E+38 != 3.40282347E+38.

Если вы явно указали спецификатор формата для вывода float.MaxValue с 9-значной точностью, например. float.MaxValue.ToString("G9"), ваш чек будет успешным.