web-dev-qa-db-fra.com

Quelle est la gamme inclusive de float et double en Java?

Quelle est la gamme inclusive de float et double en Java?

Pourquoi ne vous est-il pas recommandé d'utiliser float ou double pour quoi que ce soit où la précision est critique?

22
Austin Kelley Way

La classe Double de Java a des membres contenant la valeur Min et Max pour le type.

2^-1074 <= x <= (2-2^-52)·2^1023 // where x is the double.

Vérifiez Min_VALUE et MAX_VALUE membres finaux statiques de Double.

(certains) Les gens vont suggérer de ne pas utiliser les types à virgule flottante pour les choses où l'exactitude et la précision sont essentielles parce que les erreurs d'arrondi peuvent perturber les calculs par de (petites) quantités mesurables.

21
jjnguy

Types de données primitifs de Java

booléen: 1 bit. Peut prendre uniquement les valeurs vrai et faux.

octet: 1 octet signé (complément à deux). Couvre les valeurs de -128 à 127.

court: 2 octets, signé (complément à deux), -32 768 à 32 767

int: 4 octets, signé (complément à deux). -2 147 483 648 à 2 147 483 647.

long: 8 octets signés (complément à deux). De -9.223.372.036.854.775.808 à +9.223.372.036.854.775.807.

float: 4 octets, IEEE 754. Couvre une plage de 1,40129846432481707e-45 à 3,40282346638528860e + 38 (positif ou négatif).

double: 8 octets IEEE 754. Couvre une plage de 4,94065645841246544e-324d à 1,79769313486231570e + 308d (positif ou négatif).

char: 2 octets, non signé, Unicode, 0 à 65 535

23
jechaviz

Les nombres à virgule flottante binaire ont des caractéristiques de précision intéressantes, car la valeur est stockée sous la forme d'un entier binaire élevé à une puissance binaire. Lorsqu'il s'agit de valeurs sous-entières (c'est-à-dire des valeurs comprises entre 0 et 1), les puissances négatives de deux "arrondissent" très différemment des puissances négatives de dix.

Par exemple, le nombre 0,1 peut être représenté par 1 x 10-1, mais il n'y a pas de combinaison d'exposant de base 2 et de mantisse pouvant représenter avec précision 0,1 - le plus proche que vous obtenez est 0,0000000000000001.

Donc, si vous avez une application où vous travaillez beaucoup avec des valeurs comme 0,1 ou 0,01, mais où de petites erreurs (moins de 0,00000000000000001%) ne peuvent pas être tolérées, les nombres binaires à virgule flottante ne sont pas pour vous.

Inversement, si des puissances de dix ne sont pas "spéciales" à votre application (les puissances de dix sont importantes dans les calculs de devises, mais pas dans, disons, la plupart des applications de la physique), alors vous êtes en fait mieux en utilisant le virgule flottante binaire, car il est généralement au moins un ordre de grandeur plus rapide, et il est beaucoup plus efficace en mémoire.

L'article de la documentation Python sur problèmes et limitations en virgule flottante fait un excellent travail pour expliquer ce problème sous une forme facile à comprendre. Wikipedia a également un bon article sur virgule flottante qui explique les mathématiques derrière la représentation.

8
Daniel Pryden

De Types de données primitifs :

  • float: Le type de données float est un point flottant IEEE 754 32 bits simple précision. Sa plage de valeurs dépasse le cadre de cette discussion, mais est spécifiée dans la section 4.2. de la spécification du langage Java. Comme pour les recommandations pour byte et short, utilisez un float (au lieu de double) si vous devez économiser de la mémoire dans de grands tableaux de nombres à virgule flottante. Ce type de données ne doit jamais être utilisé pour des valeurs précises, telles que la devise. Pour cela, vous devrez utiliser la classe Java.math.BigDecimal à la place. Numbers and Strings couvre BigDecimal et d'autres classes utiles fournies par la plate-forme Java.

  • double: le type de données double est un virgule flottante IEEE 754 64 bits double précision. Sa plage de valeurs dépasse le cadre de cette discussion, mais est spécifiée dans la section 4.2. de la spécification de langage Java. Pour les valeurs décimales, ce type de données est généralement le choix par défaut. Comme mentionné ci-dessus, ce type de données ne doit jamais être utilisé pour des valeurs précises, telles que la devise.

Pour la plage de valeurs, voir la section 4.2.3 Types à virgule flottante, formats et valeurs du JLS.

5
Pascal Thivent

Bien sûr, vous pouvez utiliser des flottants ou des doubles pour des choses "critiques" ... De nombreuses applications ne font que croquer les nombres en utilisant ces types de données.

Vous avez peut-être mal compris certaines des diverses mises en garde concernant les nombres à virgule flottante, comme la recommandation de ne jamais comparer pour une égalité exacte , et ainsi de suite.

3
unwind