Aucune des réponses semblent traiter avec pourquoi 17.32
agi différents.
1. Pourquoi cela s'est produit
La différence de comportement entre 17.32
et 17.33 & 17.31
est due à la norme IEEE-754 Arrondissement règles.
Règle d'arrondi appliqué: à partir de, La Virtuelle Java™
Machine Spécification §2.8.1
L'arrondi des opérations de la machine virtuelle Java, utilisez toujours de l'IEEE
754 tour la plus proche de mode. Inexact, les résultats sont arrondis à l'unité la plus proche
représentable valeur, avec des liens d'aller à la valeur zéro
les moins de bits significatifs. C'est la norme IEEE 754 mode par défaut. La Java virtual
la machine ne donne pas tous les moyens pour modifier l'arrondi à virgule flottante
mode
2. Votre cas:
Est Double: (1 signe-bit + 11 exposant-bits + 52 fraction bits = 64bits). La représentation interne, après arrondi ci-dessous:
1 [63] 11 [62-52] 52 [51-00]
Sign Exponent Fraction
17.31 --> 0 (+) 10000000011 (+4) 1.0001010011110101110000101000111101011100001010001111
17.32 --> 0 (+) 10000000011 (+4) 1.0001010100011110101110000101000111101011100001010010 //rounded up
17.33 --> 0 (+) 10000000011 (+4) 1.0001010101000111101011100001010001111010111000010100
3. La représentation interne (la Preuve):
17.31: (Mantisse de comparaison)
Actual: 1.00010100111101011100001010001111010111000010100011110...
Internal: 1.0001010011110101110000101000111101011100001010001111
17.32: (Mantisse de comparaison)
Actual: 1.00010101000111101011100001010001111010111000010100011...
Internal: 1.0001010100011110101110000101000111101011100001010010 //round-up!
17.33: (Mantisse de comparaison)
Actual: 1.00010101010001111010111000010100011110101110000101000...
Internal: 1.0001010101000111101011100001010001111010111000010100
4. Conversion décimal:
17.31 -> 17.309999999999998721023075631819665431976318359375...
17.32 -> 17.32000000000000028421709430404007434844970703125... //(was rounded up)
17.33 -> 17.3299999999999982946974341757595539093017578125...
(IEEE-754 Outil d'Analyse)
5. Fonte à long
EDIT: Il y a un facteur de plus à jouer à la multiplication des étapes comme @Jeppe Stig Nielsen dit. Le résultat de la FP de multiplication (de Référence) de l'étape est sa propre arrondi vers le plus proche.
Cela change dont les résultats sont attendus et qui ne le sont pas, mais la raison est toujours exactement le même comme indiqué ci-dessus.
Enfin, l'étape, en raison de la fonte d' (long)
de troncature, vous laisse avec les résultats que vous voyez. (1730, 1732, 1732)
Rétrécissement Primitives De Conversion : La Java™ Spécification Du Langage §5.1.3
Si le nombre à virgule flottante n'est pas une infinité, la virgule flottante
la valeur est arrondie à un nombre entier de valeur V, arrondi vers zéro à l'aide de
La norme IEEE 754 aller-vers-le mode de zéro