web-dev-qa-db-fra.com

Comportements impairs lors de la division des doubles dans Java

Lorsque je divise 317 par 219 en Java en utilisant des doubles, je reçois 1.
Par exemple:

double b = 317/219;
System.out.println(b);

La sortie est: 1.

Est-ce parce que c'est une décimale récurrente? Ont dû utiliser BigDecimal à la place qui est ennuyeux.

16
Joe

Essaye ça

 double b = 317/219D;

Le type de numéros codé par défaut dans Java est int, donc avec le code que vous l'avez Java fonctionne avec deux int nombres et le résultat de la division serait alors int aussi, ce qui tronquera la partie décimale pour donner un résultat final de 1. Ce résultat int est ensuite jeté de int 1 à un double 1 Sans avertissement de compilateur, car il s'agit d'un élargir couler (un où le type de source est garanti pour "s'adapter" dans le type cible).

En codant l'un des chiffres comme _ double avec le suivi D (vous pouvez également utiliser d, mais j'utilise toujours des lettres majuscules car L comme minuscule l ressemble à un 1), le résultat de la division sera double aussi.

28
Bohemian

Une autre alternative ...

double b = (double)317/219;
5
xagyg

En effet, vous avez utilisé des littéraux entiers, vous faites donc une division entière.

Essayez d'écrire double b = 317.0/219.0; au lieu.

3
Dawood ibn Kareem

Il convient de mentionner qu'il n'y a pas de division dans votre exemple au moment de l'exécution. 317/219 est calculé au moment de la compilation (division entière, la fraction est supprimée) et remplacée par une constante. Si vous décompilez .Class (j'ai utilisé Jad http://www.kpdus.com/jad.html ) vous verrez

double b = 1.0D;
2
Evgeniy Dorofeev

C'est int divisant. Écrivez:

double b = 317.0/219;
System.out.println(b);
0
bellum

comme les chiffres que vous avez mis sont des inetgers, c'est la réponse.
[.____] Pour obtenir le double, vous avez besoin d'un numéro avec un point flottant ou de lancer l'un des entiers que vous utilisez:

double b = 317.0/219;
System.out.println(b);

ou:

double b = ((double)317)/219;
System.out.println(b);
0
Ofir Luzon