Cette méthode renvoie "vrai". Pourquoi?
8 Réponses :
Vous soustrayez une petite valeur (moins de 1000) de la valeur énorme em>. La petite valeur est tellement plus petite que la valeur importante que la valeur représentative la plus proche du résultat théorique reste la valeur d'origine. P>
Fondamentalement, c'est le résultat de la façon dont les numéros de points flottants fonctionnent. P>
Imagine que nous avions un type de point flottant décimal (juste pour la simplicité) qui ne stocke que 5 chiffres significatifs dans la mantissa et un exposant compris entre 0 et 1000. P>
Votre exemple est comme écrire 10 999 sup> - 1000 ... Pensez à ce que le résultat de ce serait, lorsqu'il est arrondi à 5 chiffres significatifs. Oui, le résultat exact em> est 99999 ..... 9000 (avec 999 chiffres), mais si vous ne pouvez représenter que des valeurs avec 5 chiffres significatifs, le résultat le plus proche est de 10 999 sup> encore. p>
Un double n'a pas assez de précision pour effectuer le calcul que vous tentez. Donc, le résultat est identique à la valeur initiale. P>
Ce n'est rien à voir avec le == code> Opérateur. P>
Lorsque vous définissez Selon vos besoins, vous pouvez utiliser val code> sur double.max_value / 10, il est défini sur une valeur approximativement égale à
1.7976931348623158 * 10 ^ 307 code>. Les valeurs de soustraction tels que 1000 de ce qui permettraient une précision sur la double représentation qui n'est pas possible, donc il laisse fondamentalement
val code> inchangé. p>
bigdecimal code> au lieu de
double code>. p>
val code> est un grand nombre et lors de la soustraction
1 code> (ou même
1000 code>) à partir de celui-ci, le résultat ne peut pas être exprimé correctement comme un < Code> double code> valeur. La représentation de ce nombre
x code> et
x-1 code> est la même, car
double code> n'a qu'un nombre limité de bits pour représenter un nombre illimité de chiffres. p>
double.max_value code> est un nombre énorme que 1 ou 1000.
double.max_value-1 code> est généralement égal à
double.MAx_Value code>. Donc, votre code ne fait pas grossièrement rien lors de la soustraction de 1 ou de 1000 sur
double.max_value / 10 code>.
Rappelez-vous toujours que: p>
double code> s ou
float code> S ne sont que des approximations de nombres réels, elles ne sont que des rationnelles non aussi réparties entre les réels li>
double code> s ou
float code> S qui ne sont pas proches (il y a beaucoup d'autres règles telles que celles-ci ...) li >
double code> s ou
float code> si vous avez besoin de précision arbitraire li>
ol>
Si vous soustrayez un nombre inférieur à " 1.9958403095347198E292 "à partir de outuptup: p> true p> FALSE P> P> double.max_value code> est si gros que le JVM ne dit pas la différence entre celui-ci et
double.max_value-1000 code>
double.mav_value code> Le résultat est toujours
double.max_value code>. p>
parce que comme exemple simplifié, nous voudrions peut-être pouvoir stocker des valeurs allant de -1000 à 1000 dans une petite quantité d'espace où nous ne pourrions normalement stocker qu'à -10 à 10. Nous pourrions donc arrondir toutes les valeurs à Les mille les plus proches et les stocker dans le petit espace: -1000 sont codés comme En réalité, les régimes de points flottants sont beaucoup plus compliqués que l'exemple ci-dessus, mais le concept est similaire. Les représentations de points flottants des nombres ne peuvent représenter que certains em> de tous les numéros possibles, donc lorsque nous avons un numéro qui ne peut pas être représenté dans le cadre du régime, nous devons l'arrondir à la valeur de la plus proche représenble . P>
dans votre code, toutes les valeurs dans les 1000 double code> est un point flottant Type numérique, qui est un moyen de approximation des valeurs numériques em>. Les représentations de points flottants codent des nombres afin que nous puissions stocker des nombres beaucoup plus grands ou plus petits que nous le pouvions normalement. Cependant, tous les chiffres ne peuvent pas être représentés dans l'espace donné, de sorte que plusieurs numéros sont arrondis sur la même valeur de point flottante. P>
-10 code>, -900 sont codés comme
-9 code>, 1000 sont codés comme
10 < / code>. Mais que si nous voulons stocker -999? La valeur la plus proche que nous puissions codée est -1000, nous devons donc encoder -999 comme la même valeur que -1000:
-10 code>. P>.
double.max_value / 10 code> sont automatiquement arrondies sur
double.max_value / 10 code>, c'est pourquoi l'ordinateur pense
(Double.max_value / 10) - 1000 == double.max_value / 10 code>. P>
Le résultat d'un calcul de point flottant est la valeur représentative la plus proche de la réponse exacte. Ce programme: impressions: p> Le premier de ces numéros est votre Val d'origine. La seconde est le plus grand double qui est inférieur à celui-ci. P> Lorsque vous soustrayez 1000 du 1.7976931348623158E307, la réponse exacte est entre ces deux nombres, mais très plus près de 1,7976931348623158E307 de 1,7976931348623155E307, Donc, le résultat sera arrondi au 1.7976931348623155E307, laissant Val inchangé. p> p>
parce que
val code> contient la même valeur que
Enregistrer code>?
Ceci est simplement "Comment fonctionne le travail arithmétique de points flottants?" reformulé une fois de plus.
comment venir ? VAL et SAVE ont eu la même valeur, puis la validation de la boucle 'for' a changé la valeur de VAL pendant que la valeur de sauvegarde était maintenue de la même manière.
C'est là que tu as tort.
val code> ne change pas. Lisez n'importe quel livre ou article en ligne sur l'arithmétique de point flottant.
Étant donné que les chiffres soustraits de VAL sont des ordres de grandeur inférieur à VAL et n'auront pas d'impact sur sa valeur. @ US2012 est bien sûr correct.
Il est facile de dire "lisez-y", mais si vous ne savez pas ce que vous recherchez (c'est-à-dire pourquoi cela se produit) Il est difficile de trouver les propriétés qui causent le problème.
docs.oracle.com/cd/e19957-01/806- 3568 / ncg_goldberg.html une lecture incontournable