32 votes

Pourquoi la conversion entre string et float est-elle incorrecte?

S'il vous plaît voir mon exemple ci-dessous.

 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?
 

47voto

Dmitry Bychenko Points 17719

Vous devez utiliser "R" chaîne de format:

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" ou "r" Résultat aller-retour: Une chaîne de caractères qui peut aller-retour à un nombre identique. Pris en charge par: Simple, Double, et BigInteger. Spécificateur de précision: Ignoré.

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

  bool mustEqual = (maxFloat == result);

29voto

Saeb Points 3250

// It returns FALSE, why?

Parce que float.ToString() génère un nombre de précision à 7 chiffres par défaut, votre float.MaxValue qui a pour valeur 3.40282347E+38 (précision à 9 chiffres) sera arrondi à 3.402823E+38 et votre chèque échoue à cause bien sûr de 3.402823E+38 != 3.40282347E+38 .

Si vous spécifiez explicitement un spécificateur de format pour générer float.MaxValue avec une précision de 9 chiffres, par exemple float.MaxValue.ToString("G9") , votre vérification aboutira.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X