2013-05-14 15 views
6

Fondamentalmente ho due variabili:Come posso verificare se un doppio ha una parte frazionaria?

double halfWidth = Width/2; 
double halfHeight = Height/2; 

Poiché vengono divisi per 2: possono essere un numero intero o decimale. Come posso verificare se sono un numero intero o un .5?

+2

I valori interi o in virgola mobile "Larghezza" e "Altezza"? A meno che non siano 'float' o' double', otterrai sempre un risultato intero poiché la divisione viene eseguita sulla base dei tipi di 'Width' o' Height' e 2 (tutti un tipo intero sotto questa ipotesi), e il risultato viene quindi convertito in un 'double'. –

risposta

13

È possibile utilizzare modf, questo dovrebbe essere sufficiente:

double intpart; 

if(modf(halfWidth, &intpart) == 0) 
{ 
// your code here 
} 
1

primo luogo, è necessario assicurarsi che si sta utilizzando in doppia precisione in virgola mobile per la matematica:

double halfWidth = Width/2.0; 
double halfHeight = Height/2.0; 

Perché uno degli operandi è un doppio (vale a dire, 2.0), questo costringerà il compilatore a convertire Width e Height in doppio prima di eseguire il calcolo matematico (supponendo che non siano già double s). Una volta convertita, la divisione verrà eseguita in virgola mobile a precisione doppia. Quindi avrà un decimale, se del caso.

Il passaggio successivo è semplicemente controllarlo con modf.

double temp; 
if(modf(halfWidth, &temp) != 0) 
{ 
    //Has fractional part. 
} 
else 
{ 
    //No fractional part. 
} 
+0

@JonathanLeffler: Ha bisogno di? Stai dividendo un intero per 2; se non è 0, deve essere 0,5. –

+0

OK - Vedo che stai interpretando gli input in modo un po 'diverso da me, e quindi ti viene in mente una risposta diversa (una risposta valida data la tua aspettativa sugli input). Ignorami tranquillamente ... me ne andrò ... –

Problemi correlati