Почему конвертирование между строкой и поплавком неверно?
Пожалуйста, смотрите мой пример ниже.
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?
Ответы
Ответ 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")
, ваш чек будет успешным.