2010-09-04 52 views
9

Estoy tratando de calcular el porcentaje de algo. Es matemática simple. Aquí está el código.Porcentaje El cálculo siempre devuelve 0

float percentComplete = 0; 
if (todaysCollection>0) { 
    percentComplete = ((float)todaysCollection/(float)totalCollectionAvailable)*100; 
} 

Aquí el valor de todaysCollection es 1751 y es totalCollectionAvailable 4000. Ambos son int. Pero percentComplete siempre muestra 0. ¿Por qué sucede esto? Puede alguien ayudarme. Soy nuevo en Objective C.

+0

para empezar, creo que deberías probar el divisor de cero! –

+0

@Mitch Wheat: ¿No resultaría en NaN? –

+0

pero el divisor ya es 4000, "totalCollectionAvailable es 4000" – vodkhang

Respuesta

0

Tal vez intente con * (float) 100, a veces ese es el problema;)

+3

Probablemente no, ya que solo uno de los operandos tiene que ser un flotador para que la expresión se evalúe como un flotante (gracias a implicit fundición). Sin embargo, esa es solo mi deducción inteligente. – BoltClock

+0

No sé exactamente cómo se ve en obj-c, pero en C# tuve un problema similar con eso. (float)/(float) se puede convertir a (int) antes de *. – cichy

+0

float/float siempre escriba float –

1

creo que su valor por todaysCollection y totalCollectionAvailable está mal. Verifique eso.

Coloque el NSLog(@"%d", todaysCollection) justo antes de la sentencia if

11

Pero percentComplete siempre muestra 0

¿Cómo estás mostrando percentComplete? Tenga en cuenta que es un flotador: si lo interpreta como un int sin convertirlo obtendrá el resultado incorrecto. Por ejemplo, esto:

int x = 1750; 
int y = 4000; 
float result = 0; 
if (x > 0) { 
    result = ((float)x/(float)y)*100; 
} 
NSLog(@"[SW] %0.1f", result); // interpret as a float - correct 
NSLog(@"[SW] %i", result);  // interpret as an int without casting - WRONG! 
NSLog(@"[SW] %i", (int)result); // interpret as an int with casting - correct 

Muestra esto:

2010-09-04 09:41:14.966 Test[6619:207] [SW] 43.8 
2010-09-04 09:41:14.967 Test[6619:207] [SW] 0 
2010-09-04 09:41:14.967 Test[6619:207] [SW] 43 

tener en cuenta que echando un valor de punto flotante a un tipo entero simplemente descarta el material después de la coma - lo que en mi ejemplo 43.8 renders como 43. para redondear el valor de coma flotante con una precisión de uso entero una de las funciones de redondeo de math.h, por ejemplo:

#import <math.h> 

... rest of code here 

NSLog(@"[SW] %i", (int)round(result)); // now prints 44 
+0

Perfecto, increíble, gracias, te amo! Esta es la respuesta correcta. =) – RanLearns

Cuestiones relacionadas