2012-12-02 18 views
14

Quando divido 317 da 219 in Java utilizzando doppie ottengo 1.
Per esempio:comportamenti strani quando dividendo raddoppia in Java

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

uscita è: 1.

È questo, perché è un decimale ricorrente? Hanno dovuto usare invece BigDecimal che è fastidioso.

+0

l'output sarà 1.0 per essere più precisi –

+0

Possibile duplicato di [divisione Java Integer: Ho w produci un doppio?] (http: // stackoverflow.com/domande/3144610/java-integer divisione-how-do-you-produce-a-doppia). Ho preso la mia scelta, ma questa domanda è stata posta troppe volte su SO. – demongolem

risposta

22

Prova questo tipo

double b = 317/219D; 

L'impostazione predefinita di numeri codificati in Java è int, quindi con il codice come lo avete java sta lavorando con due int numeri e il risultato della divisione sarebbe quindi int, che troncherà la parte decimale per dare un risultato finale di 1. Il risultato int viene quindi convertito da int 1 in un double 1 senza un avviso del compilatore perché è un allargamento cast (uno in cui il tipo di origine è garantito per "adattarsi" al tipo di destinazione).

codificando uno dei numeri come double con la finale D (si può anche usare d, ma ho sempre utilizzare le lettere maiuscole perché L in minuscolo l sembra un 1), il risultato della divisione sarà double troppo .

+1

La maggior parte delle altre risposte semplicemente applica '.0' per forzare l'aritmetica in virgola mobile (doppia), ma questa risposta dichiara esplicitamente che entrambi gli operandi siano di tipo double; un punto sottile ma significativo! –

+0

Ero sicuro di aver provato a trasmettere il doppio! Credo di essere stato solo stupido. Grazie per l'aiuto! – Joe

3

Questo perché i letterali interi sono utilizzati, quindi stai eseguendo una divisione intera.

Provare a scrivere double b = 317.0/219.0;.

0

Questo è int divisione. Scrivi:

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

poiché i numeri che inserisci sono inetger, quindi è la risposta.
per ottenere il doppio è necessario sia per utilizzare un numero con virgola mobile o per lanciare uno dei numeri interi che si utilizza:

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

o:

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

Vale la pena ricordare che non c'è divisione nel tuo esempio in fase di runtime. 317/219 viene calcolato in fase di compilazione (divisione intera, la frazione viene scartata) e sostituita con una costante. Se decompilare .class (io ho usato Jad http://www.kpdus.com/jad.html) si vedrà

double b = 1.0D; 
5

Un'altra alternativa ...

double b = (double)317/219; 
-2

Si potrebbe provare

double b = 0.0; 
b = 317/219; 

modo che io possa restituire il decimale point

+0

Questa non è la risposta giusta. sia 317 che 219 sono int quindi il risultato sarà la parte int della divisione indipendentemente dal tipo di parametro. – zohar

+0

Ci possono essere molte cose che puoi provare oltre che sopra. Tuttavia @Joe aveva avuto problemi a capire come funzionano le cose aritmatiche in Java. Questa non dovrebbe essere una risposta. – prageeth

Problemi correlati