2010-09-13 37 views
18

Algo realmente extraño está sucediendo.objetivo-c divide siempre devuelve 0

float p1 = (6/100); 
NSLog(@"p1 = %f", p1); 

Con esas dos líneas de código me da el siguiente resultado:

p1 = 0,000000

¿Por qué es un devide sencilla con los números estáticos que no trabaja! ¡Tengo tanto trabajo que hacer para lidiar con dividir no funciona! Qué diablos, ¿estoy loco?

Respuesta

35

Esas constantes son enteros, por lo que las matemáticas se hacen con números enteros. Trate

float p1 = (6.0/100.0); 

edición — @Stephen Canon señala sabiamente que, dado que "P1" es una float, no hay razón para no hacer todo el cálculo que float:

float p1 = (6.0f/100.0f); 

Ahora, dado que los las cosas son constantes, me imagino que hay muchas posibilidades de que el compilador vaya a hacer el trabajo de todos modos. También es cierto que, debido a que en algunas máquinas modernas (es decir, arquitectura Intel), el conjunto de instrucciones del procesador de punto flotante es lo suficientemente extraño como para que algo que parece una "optimización" obvia pueda funcionar o no de esa manera. Finalmente supongo que podría ser el caso que haciendo la operación con las constantes float podría (en algunos casos) dar un resultado diferente que haciendo la operación con double valores y luego fundir a float, que de ser cierto sería probablemente el mejor argumento para decidiendo de una forma u otra.

+0

gracias, eso fue todo. –

+4

En realidad debería aceptar la respuesta si contestó su pregunta. – imaginaryboy

+1

Pero use literales de precisión simple para evitar una conversión innecesaria de doble a simple: 'float p1 = 6.0f/100.0f' –

9

Su tarea contiene una división entera, que devuelve cero si el número que divide es mayor. Es probable que pretende hacer:

float p1 = (6.0f/100.0f); 
12

Dado que ambos números son considerados como números enteros por el ordenador, matemáticas número entero se realiza y un entero se devuelve sin decimales, que es 0 (0.06), luego se convierte a flotar y almacenado en la variable p1.

Al menos un número (o ambos) tiene que estar flotante para hacer matemática de coma flotante, cuando agrega un decimal a un número, le dice a la computadora que la constante es un número de coma flotante.

float p1 = (6.0/100); 

O usted podría encasillarse que

float p1 = ((float)6/100); 
1

un trabajo en torno a dividir dos variables int y obtener resultado flotador.

int x = 5; 
int y = 7; 

float z = x/y; // always 0 

La solución:

float z = 1.0 * x/y; 

Nota: si cambia el orden esta solución no funcionará.

Editar: De acuerdo con esta respuesta previous answer Se puede utilizar esta

float z = (float) x/y;