parseFloat() vs parseDouble()
Je suis en train d'essayer le code ci-dessous pour convertir la chaîne de float et double, mais obtenir des résultats différents.
Code:
System.out.println(Float.parseFloat("120059389"));
System.out.println(Double.parseDouble("120059389"));
De sortie:
1.20059392E8
1.20059389E8
Quelqu'un pourrait m'expliquer pourquoi j'ai obtenu des résultats différents pour l'analyse de la chaîne en float et double? Quelles sont les plages pour les float et double?
Cela aidera à:docs.oracle.com/javase/tutorial/java/nutsandbolts/...
Obligatoire: docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Google "en virgule flottante IEEE". Il y a un article de Wikipédia qui explique tout, et n'est pas trop dense.
Obligatoire: docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Google "en virgule flottante IEEE". Il y a un article de Wikipédia qui explique tout, et n'est pas trop dense.
OriginalL'auteur vikifor | 2014-04-09
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous essayez d'analyser un
float
en lui donnant plus de chiffres significatifs que l'on peut gérer. Le "ulp" (unité en dernier lieu) d'unfloat
que gros est8.0
, mais le "ulp" pour undouble
que big est encore assez faible. C'est, à l'ampleur, le plus proche possiblefloat
valeurs diffèrent par8
, mais le plus prochedouble
valeurs, avec plus de précision, diffèrent en beaucoup moins.Cette affiche:
De sorte que le
Float
analyseur doit utiliser le plus prochefloat
à la valeur vraie de120059389
, qui se trouve être1.20059392E8
.OriginalL'auteur rgettman
La différence réside dans le fait que
Double
etFloat
stocker des nombres différemment.À Simple et Double précision, permettant
Double
pour donner Double le degré de précision de laFloat
peut gérer.Donc, la réponse est simple, parce que de
Float
's de la mémoire limitée en comparaison àDouble
de l'information est perdue lors de la conversion de nombres en dehors de la gammeFloat
peut gérer.Float
: Nombres de 32 bitsDouble
: 64-bit NombreDonc dans la conversion de l'information est perdue lors de la conversion à la
Float
parce qu'il est tronqué.Généralement...
Float
stocke les nombres comme 1 bit pour le signe (-/+
), 8 bits pour l'Exposant et 23 bits pour la fraction.Double
stocke les nombres comme 1 bit pour le signe (-/+
), 8 bits pour l'Exposant, et de 53 bits pour la fraction.Lorsque vous convertissez votre numéro de
120059389 = 111001001111111010111111101b
a 27 bits d'information, qui peuvent être couverts par laDouble
'53 bits allowence, mais pas par laFloat
'23 bits de l'allocation, et les données sont tronquées au moins significatifs.La conversion va arrondir le nombre le plus proche nombre représentable à l'aide de 23 bits
1.20059392 = 111001001111111011000000000b
et l'exposant s'occupe du reste de l'expansion.OriginalL'auteur Farmer Joe
Le plus tôt des liens et des réponses à donner les bonnes réponses techniques. Le "dilettantes" réponse, c'est que d'un flotteur est de 32 bits et un double est de 64 bits. Certains de ces bits sont utilisés pour le nombre et certains sont utilisés pour l'exposant. Le nombre que vous mettez dans votre code avait tout simplement trop de chiffres pour les 32 bits de "flotter". Le 64 bits 'double' a plus de bits et peut être plus précis avec un plus grand nombre.
Le même concept, même pour les plus grands nombres lorsque vous atteignez les limites de 64 bits en double et la nécessité de 128 bits de précision.
OriginalL'auteur CramerTV