2013-04-12 16 views
39

Ho un doppio valore che devo visualizzare sulla mia interfaccia utente. Ora la condizione è che il valore decimale di double = 0 es. - 14,0 In tal caso devo mostrare solo 14 sulla mia interfaccia utente. Inoltre, il limite massimo per i caratteri è 5 qui.Come verificare se un doppio valore non ha una parte decimale

ad es. 12,34 il valore intero non può essere maggiore di 2 cifre e quindi è il valore decimale per il nostro doppio.

Quale potrebbe essere il modo migliore per farlo?

risposta

129

Si potrebbe semplicemente fare questo: d % 1 == 0 per vedere se alcuni double d è intero.

+4

questo Double.MIN_VALUE% 1 == 0 dà false –

+6

@Evgeniy Dopotutto, 'Double.MIN_VALUE' non è completo. –

+1

+1 sei sodo –

2

Confrontare due valori: il doppio normale e il doppio dopo floor. Se hanno lo stesso valore, non esiste alcun componente decimale.

12
double d = 14.4; 
if((d-(int)d)!=0) 
    System.out.println("decimal value is there"); 
else 
    System.out.println("decimal value is not there"); 
+1

Si dovrebbe probabilmente usa '! =' piuttosto che '>', poiché restituirà false per i valori negativi 'd'. –

+0

non funziona con -11111111111111,1; –

+0

ohh sì, ho aggiornato il mio codice. Grazie :) –

6

o soffitto e pavimento dovrebbero dare lo stesso fuori fuori mettere

Math.ceil(x.y) == Math.floor(x.y) 

o semplicemente verificare la presenza di uguaglianza con doppia valenza

x.y == Math.ceil(x.y) 
x.y == Math.floor(x.y) 

o

Math.round(x.y) == x.y 
+1

Cosa dire di '' 'Math.round (x) == x''' dove' '' x''' una espressione dattiloscritta. –

1

Usa numero formattatore per formattare il valore, come richiesto d. Si prega di controllare this.

7

Tutti gli integer sono modulo di 1. Quindi sotto il controllo è necessario fornire la risposta.

if(d % 1 == 0) 
1

probabilmente si desidera arrotondare il doppio a 5 decimali o giù di lì prima che il confronto in quanto una doppia possono contenere piccole parti decimali se avete fatto alcuni calcoli con esso.

double d = 10.0; 
d /= 3.0; // d should be something like 3.3333333333333333333333... 
d *= 3.0; // d is probably something like 9.9999999999999999999999... 

// d should be 10.0 again but it is not, so you have to use rounding before comparing 

d = myRound(d, 5); // d is something like 10.00000 
if (fmod(d, 1.0) == 0) 
    // No decimals 
else 
    // Decimals 

Se si utilizza C++ non credo che ci sia un round-funzione, in modo da avere per la sua attuazione da soli come in: http://www.cplusplus.com/forum/general/4011/

0

Interessante piccolo problema. È un po 'complicato, dal momento che i numeri reali, non sempre rappresentano interi esatti, anche se sono pensati, quindi è importante consentire una tolleranza.

Per esempio la tolleranza potrebbe essere 1E-6, nei test di unità, ho mantenuto una tolleranza piuttosto grossolana per avere numeri più corti.

Nessuna delle risposte che posso leggere ora lavora in questo modo, ecco la mia soluzione:

public boolean isInteger(double n, double tolerance) { 
    double absN = Math.abs(n); 
    return Math.abs(absN - Math.round(absN)) <= tolerance; 
} 

E il test di unità, per assicurarsi che funzioni:

@Test 
public void checkIsInteger() { 
    final double TOLERANCE = 1E-2; 
    assertThat(solver.isInteger(1, TOLERANCE), is(true)); 

    assertThat(solver.isInteger(0.999, TOLERANCE), is(true)); 
    assertThat(solver.isInteger(0.9, TOLERANCE), is(false)); 

    assertThat(solver.isInteger(1.001, TOLERANCE), is(true)); 
    assertThat(solver.isInteger(1.1, TOLERANCE), is(false)); 

    assertThat(solver.isInteger(-1, TOLERANCE), is(true)); 

    assertThat(solver.isInteger(-0.999, TOLERANCE), is(true)); 
    assertThat(solver.isInteger(-0.9, TOLERANCE), is(false)); 

    assertThat(solver.isInteger(-1.001, TOLERANCE), is(true));   
    assertThat(solver.isInteger(-1.1, TOLERANCE), is(false)); 
} 
Problemi correlati