2011-01-12 7 views
6

Pregunta muy simple aquí. Tengo un doble que deseo convertir de nuevo a un NSInteger, truncando al lugar de las unidades. ¿Como podría hacerlo?¿Cómo convertir un doble a NSInteger?

+1

¿Por qué razón desea un NSInteger en lugar de un NSNumber? también quieres redondeo o simplemente un corte recto? –

+0

Ahora que lo pienso, sería bueno tenerlo rondando. –

Respuesta

14

truncamiento es una conversión implícita:

NSInteger theInteger = theDouble; 

Eso suponiendo que no está comprobando el valor está dentro del rango de NSInteger. Si quieres hacer eso, usted tiene que añadir un poco de ramificación:

NSInteger theInteger = 0; 
if (theDouble > NSIntegerMax) { 
    // ... 
} else if (theDouble < NSIntegerMin) { 
    // ... 
} else { 
    theInteger = theDouble; 
} 
+0

Exactamente lo que estaba buscando, gracias. Se agregó la bonificación de verificar el rango, excepto que no tengo que preocuparme por eso para mi uso. ¡Gracias de nuevo! –

+3

Mencionaste redondear en un comentario. Use 'ceil (theDouble)' para redondear, 'floor (theDouble)' para redondear hacia abajo. Recuerde que para los números negativos, el redondeo se redondea hacia cero, y el redondeo hacia abajo es redondeado hacia el infinito negativo. –

+0

+1: ahh hice una función de redondeo simple a continuación ... no recuerdo el techo y el piso para los dobles. respuesta mucho mejor y más precisa –

4

NSInteger es un typedef para un tipo C. Por lo que sólo puede hacer:

double originalNumber; 
NSInteger integerNumber = (NSInteger)originalNumber; 

Lo cual, por la especificación C, truncará OriginalNumber.

+0

Parece que obtuvo la misma respuesta al mismo tiempo. :) –

+1

Sí, pero el alcance cubierto por Jonathan, definitivamente merece el tic. – Tommy

1

pero de todos modos, si quiere enviar un redondeo, creo que esto debería funcionar simplemente

double myDouble = 10.4223; 
NSInteger myInt = myDouble; 

de edición para redondear: (estoy seguro theres una manera mucho más simple (y preciso) para hacer esto .. (esto también no da cuenta de los números negativos o límites máximos)

double myDecimal = myDouble - myInt; 
if(myDecimal < 0.50) 
{ 
//do nothing 
} 
else 
{ 
myInt = myInt + 1; 
} 
1

NSInteger es un typedef, es lo mismo que usar un int Basta con asignar el valor como:.

double d;
NSInteger i = d;

0

JesseNaugher menciona el redondeo y observo que las necesidades de OP se cumplieron con un simple truncamiento, pero en el espíritu de la generalización completa vale la pena recordar el truco simple de agregar 0.5 al doble antes de invocar piso() para lograr el redondeo. Extendiendo el comentario de Jonathan Grynspan: NSInteger myInt = floor(myDouble + 0.5); es decir, redondeando en términos absolutos. Si redondear 'hacia arriba' significa redondear desde cero, se necesita un enfoque más enrevesado: NSInteger myInt = floor(myDouble + (myDouble < 0.0 ? -0.5 : 0.5));