Proszę zobaczyć mój przykład poniżej.Dlaczego konwersja między ciągiem a zmiennoprzecinkowym jest nieprawidłowa?
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?
Dmitry ma odpowiedź, ale zauważ, że porównywanie elementów pływających dla dokładnej równości jest prawie zawsze błędem - powinieneś wybrać rodzaj precyzji, jaki chcesz, upewnij się, że jest w zakresie możliwości danego typu danych, i wykonaj porównanie tylko z podana dokładność. – Luaan
@Luaan Nie jest błędem, jeśli upewnisz się, że podróże w obie strony nie zmieniają wartości, co jest ważną rzeczą, której należy chcieć od serializacji i deserializacji. Nawet jeśli późniejsze obliczenia nie są dokładnie przewidywalne z powodu zaokrągleń, nie ma powodu, aby akceptować błąd zaokrąglania w krokach, które mogą być dokładne (takie jak float -> string -> float roundtrip). – delnan
Porównywanie wartości zmiennoprzecinkowych dla równości jest prawie * zawsze * a *** bug ***. – RBarryYoung