J'ai cherché Internet essayant de comprendre dans sa forme simpliste pourquoi ce comportement se produit.
Dim mysingle As Single = 456.11 Dim mybool As Boolean = mysingle = 456.11
3 Réponses :
Je recommande de lire: Ce que chaque scientifique informatique doit savoir sur l'arithmétique de point flottant < / a>. p>
Il explique les problèmes de précision dans des calculs de points flottants en détail. Pour une variation plus simple sur ce qui précède, voir Le guide de point flottant . P>
La valeur étant comparée dans la deuxième instruction n'est pas considérée comme un unique code>, il est plutôt traité comme un
double code>. Puisque vous utilisez vb.net, vous pouvez le suffixer avec un
! Code> pour le forcer à un
unique code> et cela retournera
true code>:
Dim mysingle As Single = 456.11
Dim mybool As Boolean = mysingle = 456.11!
+1: C'est complètement vrai - le problème provient de faire des comparaisons doubles / simples. Toutefois, la raison pour laquelle il s'agit d'un problème est due à la précision des points flottants - compréhension qui rendra cette réponse beaucoup plus évidente.
@Reed merci, définitivement en accord avec vous sur ce point.
Il est curieux que vb.net et c # interdirent généralement les affectations de double code> à
un seul code>, mais permettent des affectations dans la direction inverse ainsi que des comparaisons d'égalité directe, malgré cela, nonobstant ce dernier sont beaucoup plus cher avec péril que le premier. Forcer un double à un seul peut entraîner une perte de précision, mais toutes les opérations numériques peuvent causer une telle perte et la perte ne posera généralement pas un problème, sauf lorsque les chiffres sont convertis (qui devraient avoir besoin d'une distribution). Quels seraient plus surprenants résultats:
Dim X comme Double = FIN / 10.0F CODE> ou
DIM Y comme Single = FIN / 10 CODE>?
Une autre bonne référence pour la compréhension du point flottant dans .NET: http: // www. yoda.arachsys.com/cshaarp/floitantpoint.html p>
Permettez-moi de souligner son point sur les comparaisons: P>
Une conséquence de tout cela est que Vous devriez très rarement être rarement comparer le point flottant binaire chiffres pour l'égalité directement. [...] Un moyen simple de faire c'est soustrayez un de l'autre, utilisez Math.abs pour trouver la valeur absolue de la différence, puis vérifier si Ceci est inférieur à une certaine tolérance niveau. strong> p> blockQuote>