J'ai un scénario dans .net (4.6.1) où l'analyse d'une représentation sous forme de chaîne d'une valeur à virgule flottante 6dp produit des résultats différents dans 32 et mode 64 bits.Problème d'analyse double 64 bits 32 bits avec le spécificateur de formatage aller-retour "R"
[Fact]
public void ParseTest()
{
var numText = "51.580133";
double.Parse(numText)
.ToString("R")
.Should().Be(numText);
}
Ce test passe en mode 32 bits, mais pour mode 64 bits échoue le texte généré est: « 51,580132999999996 »
Je vous attendriez des problèmes d'arrondi comme celui-ci avec des nombres irrationnels ou des chiffres obtenus au moyen d'un équation, mais il n'y a pas d'ambiguïté sur la longueur et la précision du point flottant ici.
Cela fait partie d'un système plus ancien, donc tout changer en décimal nécessiterait un effort significatif.
Questions:
- Pourquoi cela?
- Quelles sont les options pour arrondir/tronquer de façon fiable cette valeur à 6dp?
Mise à jour Cela fonctionne et produit une sortie différente de ToString ("G6"):
[Fact]
public void ParseText()
{
var numText = "51.580133";
double.Parse(numText)
.ToString("G8")
.Should().Be(numText);
}
Eh bien, croyez-vous que le problème est avec l'analyse syntaxique ou la mise en forme? Gardez à l'esprit que le «double» le plus proche de 51.580133 est * exactement * 51.58013299999999645706338924355804920196533203125. –
[MSDN] (https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#the-round-trip-r-format-specifier): _ " Si la valeur est correctement analysée avec la même valeur numérique, elle est formatée à l'aide du spécificateur de format général.Si la valeur n'est pas réexpédiée avec la même valeur numérique, elle est formatée avec 17 chiffres de précision pour un double "_ –