J'écrivais ce code:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
Le résultat est 0. Pourquoi et comment résoudre ce problème?
java
integer-division
Tofiq
la source
la source
int i = .99999999
met int à 0. Plus spécifiquement, il prend la partie entière et rejette le reste.DOWN
est vers zéro. L'arrondiFLOOR
est vers l'infini négatif.1/3
utilise la division entière car les deux côtés sont des entiers.Vous avez besoin d'au moins l'un d'entre eux pour être
float
oudouble
.Si vous entrez les valeurs dans le code source comme votre question, vous pouvez le faire
1.0/3
; l'1.0
est double.Si vous obtenez les valeurs ailleurs, vous pouvez les utiliser
(double)
pour transformer leint
fichierdouble
.la source
Le projeter explicitement comme un
double
Cela se produit parce que Java utilise l'opération de division entière pour
1
et3
depuis que vous les avez entrées en tant que constantes entières.la source
Tu devrais utiliser
ou
La division entière renvoie un entier.
la source
Parce que vous faites une division entière.
Comme le dit @Noldorin, si les deux opérateurs sont des entiers, alors la division entière est utilisée.
Le résultat 0.33333333 ne peut pas être représenté comme un entier, donc seule la partie entière (0) est affectée au résultat.
Si l'un des opérateurs est un
double
/float
, alors l'arithmétique en virgule flottante aura lieu. Mais vous aurez le même problème si vous faites cela:la source
Parce qu'il traite 1 et 3 comme des entiers, arrondissant donc le résultat à 0, de sorte que ce soit un entier.
Pour obtenir le résultat que vous recherchez, dites explicitement à java que les nombres sont des doubles comme ceci:
la source
Faire du 1 un flotteur et une division flottante sera utilisée
la source
La conversion en JAVA est assez simple mais nécessite une certaine compréhension. Comme expliqué dans le JLS pour les opérations sur les entiers :
Et un exemple est toujours la meilleure façon de traduire le JLS;)
Un petit exemple utilisant Eclipse pour montrer que même une addition de deux
short
s ne sera pas si simple:Cela nécessitera un moulage avec une perte de précision possible.
La même chose est vraie pour les opérateurs à virgule flottante
La promotion se fait donc sur le flotteur en double.
Et le mélange de valeurs entières et flottantes donne des valeurs flottantes comme dit
Ceci est vrai pour les opérateurs binaires mais pas pour les "opérateurs d'affectation" comme
+=
Un simple exemple de travail suffit à le prouver
La raison est qu'il y a un cast implicite fait ici, ce sera exécuté comme
la source
1 et 3 sont des nombres entiers et donc Java effectue une division entière dont le résultat est 0. Si vous voulez écrire des constantes doubles, vous devez écrire
1.0
et3.0
.la source
La solution la plus simple est simplement de faire ceci
Ce que cela fait, puisque vous n'avez pas entré 1.0 / 3.0, vous permet de le convertir manuellement en type de données double puisque Java a supposé qu'il s'agissait d'une division Integer, et il le ferait même si cela signifiait réduire la conversion. C'est ce qu'on appelle un opérateur de cast.
la source
J'ai fait ça.
Utilisez .0 tout en faisant des calculs doubles, sinon Java supposera que vous utilisez des nombres entiers. Si un calcul utilise une quantité de valeurs doubles, la sortie sera une valeur double. Si le sont tous des nombres entiers, alors la sortie sera un entier.
la source
(1/3) signifie division entière, c'est pourquoi vous ne pouvez pas obtenir de valeur décimale à partir de cette division. Pour résoudre ce problème, utilisez:
la source
Étant donné que 1 et 3 sont des entiers, le résultat n'est pas arrondi mais tronqué. Vous ignorez donc les fractions et ne prenez que des entiers.
Pour éviter cela, utilisez au moins un de vos nombres 1 ou 3 sous forme décimale 1.0 et / ou 3.0.
la source
Essayez ceci:
la source
Faites "double g = 1.0 / 3.0;" au lieu.
la source
Beaucoup d'autres n'ont pas souligné le vrai problème:
Cela signifie nécessairement que les résultats en virgule flottante, qui pourraient être affichés sous forme d'entier, seront tronqués (coupez la partie décimale).
Qu'est-ce que le casting (conversion de type / conversion de type) vous demandez-vous?
Cela varie selon l'implémentation du langage, mais Wikipédia a une vue assez complète, et il parle également de coercition , qui est une information essentielle pour répondre à votre question.
http://en.wikipedia.org/wiki/Type_conversion
la source
1/2
, pas dans la langue cible (java). Vous appelez simplement une division entière, qui se traduira par un résultat entier. La conversion de type est uniquement due à la conversion ascendante deint
en adouble
pendant l'affectation.0.5
. Simplement, en Java,1/2
est une division entière, qui se traduit par un entier nul. Vous pouvez attribuer un zéro à un double, ce sera toujours un zéro, bien qu'un0.0
double.