with what tutorial espaƱol djangoproject develop desde cero applications objective-c operations divide

objective-c - what - projects django



objetivo-c dividir siempre devuelve 0 (4)

Algo realmente extraño está sucediendo.

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

Con esas dos líneas de código obtengo la siguiente salida:

p1 = 0.000000

¿Por qué un simple devide con números estáticos no funciona? Tengo mucho trabajo que hacer para lidiar con la división no funciona! ¿Qué diablos, estoy loco?


Como la computadora considera que ambos números son números enteros, se realiza matemática de números enteros y se devuelve un número entero sin decimales, que es 0 (0.06), luego se convierte a flotar y se almacena en la variable p1.

Al menos un número (o ambos) tiene que ser flotante para hacer cálculos de punto flotante, cuando agrega un decimal a un número, le dice a la computadora que la constante es un número de punto flotante.

float p1 = (6.0 / 100);

O podrías encasillarlo

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


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

float p1 = (6.0 / 100.0);

edit - @Stephen Canon señala sabiamente que dado que "p1" es un float , no hay razón para no hacer todo el cálculo como float :

float p1 = (6.0f / 100.0f);

Ahora, dado que ambas cosas son constantes, me imagino que hay una muy buena posibilidad 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, la arquitectura Intel), el conjunto de instrucciones del procesador de punto flotante es lo suficientemente extraño como para que algo que parezca una "optimización" obvia puede o no funcionar de esa manera. Por último, supongo que podría darse el caso de que realizar la operación con constantes de float (en algunos casos) dé un resultado diferente que realizar la operación con valores double y luego convertir en float , lo que de ser cierto sería el mejor argumento para decidir uno camino o al otro.


Su asignación contiene una división de enteros, que devuelve cero si el número por el que se divide es mayor. Probablemente quisiste hacer:

float p1 = (6.0f / 100.0f);


Una solución para dividir dos variables int y obtener un resultado flotante.

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 respuesta anterior Puedes usar esto

float z = (float) x / y;