171 votes

Ce qui ' s mal avec l’aide de == pour comparer des flotteurs en Java ?

Selon cette page java.sun == est l’opérateur de comparaison d’égalité pour flottant des nombres à virgule dans Java.

Cependant, lorsque je tape ce code :

dans mon éditeur et de l’exécution d’analyse statique, j’obtiens : « valeurs à virgule flottante JAVA0078 comparés avec == »

Quel est le problème avec l’aide de == pour comparer les valeurs à virgule flottante ? Quelle est la façon correcte de le faire ?

208voto

Victor Points 2505

la bonne façon de tester les flotteurs pour « l’égalité » est :

où epsilon est un très petit nombre comme 0.00000001, selon la précision désirée.

53voto

Paul Sonier Points 25528

Les valeurs à virgule flottante peut être désactivé par un peu, de sorte qu'ils ne peuvent pas déclarer comme étant exactement égale. Par exemple, la définition d'un flotteur à "6.1", puis imprimez-le à nouveau, vous pouvez obtenir une valeur déclarée de quelque chose comme "6.099999904632568359375". C'est un élément essentiel pour les flotteurs de travail; par conséquent, vous ne voulez pas de les comparer à l'aide de l'égalité, mais plutôt la comparaison au sein d'une gamme, qui est, si la diff de la flotte vers le numéro que vous souhaitez comparer à est inférieur à une certaine valeur absolue.

Cet article sur le Registre donne un bon aperçu de pourquoi c'est le cas, ce qui est utile et intéressant à lire.

22voto

Bill K Points 32115

Juste pour donner la raison derrière ce que tout le monde est en train de dire.

La représentation binaire d'un flotteur, est une sorte de gênant.

En binaire, la plupart des programmeurs savoir la corrélation entre 1b=1d, 10b=2d, 100b=4d, 1000b=8d

Eh bien, il fonctionne dans l'autre sens aussi.

.1b=.5d .01b=.25d, .001b=.125, ...

Le problème est qu'il n'y a aucune façon de représenter des nombres décimaux comme .1, .2, .3, etc. Tout ce que vous pouvez faire est de l'approximatif en binaire. Le système fonctionne un peu le fudge arrondi, lorsque le nombre d'impression de sorte qu'il affiche .1 au lieu de .10000000000001 ou .999999999999 (qui sont sans doute tout aussi proche de la représentation stockée comme .1)

Par ailleurs, si vous êtes curieux de savoir le nombre il stocke en interne est une pure représentation binaire à l'aide d'un binaire "Notation Scientifique". Donc, si vous lui avez dit pour stocker le nombre décimal de 10,75 d, il serait de stocker les 1010b pour le 10, et .11b pour la virgule. Donc, il serait de stocker les .101011 puis il enregistre quelques morceaux à la fin pour dire: Déplacer la virgule quatre places.

(Même si, techniquement, ce n'est plus un point décimal, c'est maintenant un binaire point, mais cette terminologie n'aurait pas rendu les choses plus compréhensibles pour la plupart des gens qui trouver cette réponse de toute utilisation.)

19voto

AakashM Points 32891
<blockquote> <p>Quel est le problème avec l’aide de == pour comparer les valeurs à virgule flottante ?</p> <p>Parce que ce n'est pas vrai que<code></code></p></blockquote>

8voto

Eric Wilson Points 8494

Valeurs de point de Foating ne sont pas fiables, en raison de l’erreur d’arrondissement.

Ainsi ils devraient probablement pas servir pour des valeurs de clés, tels que sectionID. Utiliser des entiers au lieu de cela, ou si ne contient pas assez de valeurs possibles.

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