2015-04-17 2 views
-2

Я хочу выполнить несколько вычислений по значениям с плавающей точкой, проблема возвращается NaN, вот что я пытаюсьПолучение NaN на флоат деления

float totalRatingCount = users.count; 
float score = 0.0; 
for (NSManagedObject *managedObj in users) { 
    User_agent_rating *user = (User_agent_rating*)managedObj; 
    score = score + [user.status.score floatValue]; 
} 
//float scoreInFloat = (float)score/(float)totalRatingCount; 
float scoreInFloat = score/totalRatingCount; 

scoreInFloat возвращает NaN почти во всех случаях, я ищу для базового разделения двух значений, что может быть проблемой здесь?

+1

Убедитесь, что 'score' и' totalRatingCount' оба являются ненулевым элементом. –

+0

Ну, добавьте пару операторов if, чтобы проверить, равен ли делитель нулю перед делением. – Tarik

ответ

1

Я реорганизовать немного использовать замечательный оператор на ключ кодирования значения:

#include <math.h> 
    float scoreInFloat = [[users valueForKeyPath:@"@avg.status.score"] floatValue]; 
    if (isnan(scoreInFloat)) { 
     // handle nan here 
    } 
    else { 

    } 

Я пишу без проверки, так что может быть несколько ошибок.
У KVC есть различные операторы, такие как: @ sum, @ count и т. Д.
Ваша операция верна, но это более синтаксический и более читаемый. Check more here.

1

Деление на ноль (в некоторых других случаях) дает результат NaN (а не число).

Для проверки на NaN вы сравниваете одно и то же значение с самим собой и вернете false для NaN.

if(scoreInFloat != scoreInFloat) isNaN = YES 
+0

Я предпочел бы использовать isnan для удобочитаемости. – Tarik

+0

Вы должны использовать этот макрос. Я просто сказал, что вы знаете, как это работает. –

+0

Хорошо. Вы можете отредактировать свой ответ, указав, что макрос предпочтительнее. – Tarik

Смежные вопросы