2017-08-17 2 views
1

J'ai observé un problème étrange (pour moi) en C# (.Net 4.6.1) avec des variables à virgule flottante.double erreur d'arrondi sans calcul

J'ai un propre classe simple Point:

public class Point 
{ 
    public readonly double X; 
    public readonly double Y; 


    public Point(double x, double y) 
    { 
     this.X = x; 
     this.Y = y; 
    } 

    //... 

} 

Et une classe Rectangle par Contient méthode. Parfois - très difficile à reproduire - quand je passe un objet Point à la méthode Contains d'un objet Rectangle, les valeurs de X ou Y ne sont pas les mêmes. Il n'y a pas de calcul entre ou tout autre changement de la variable. Juste obtenir la valeur de la variable. Dans la méthode d'appel, la valeur est OK et dans la méthode appelée, la valeur a une erreur d'arrondi.

calling the Contains method

inside the called Contains method

Quel est le problème ici? Pourquoi y a-t-il une autre valeur dans la méthode appelée?

A la fin, la valeur ne change pas. Donc, dans la méthode de l'appelant, la valeur est encore OK plus tard.

Merci d'avance!

Maas

+4

Cela semble être une différence d'affichage dans le débogueur. Je soupçonne que si vous essayez de trouver la valeur * exact *, vous le verrez rester le même. (Que se passe-t-il si vous développez 'intersectionPoint' par exemple? Ou montre' intersectionPoint.Y.ToString ("r") '?) –

+0

Ouais, mon erreur. Je n'ai pas développé "intersectionPoint". * honte * :) Je pensais que la méthode ToString affiche la valeur complète. ToString -> return $ "{this.X}; {this.Y}"; – Maas

Répondre

0

OK, c'était mon erreur. J'ai supposé que la méthode ToString de Point montre la valeur complète. Normalement, c'est le cas.

public override string ToString() 
{ 
    return $"{this.X};{this.Y}"; 
} 

La valeur a également une erreur d'arrondi dans la méthode de l'appelant.