2013-10-11 2 views
2

Это была довольно долгая неделя, так что простите меня, если я буду густым.ошибка: недействительные операнды до двоичных% при приеме модуля float

У меня есть некоторый код, как:

float someFloat = 0; 
//....do some stuff to someFloat 
//.... 

if(someFloat % 1) 
{ 
    //take some action 
} 

Я получаю ошибку компиляции: error: invalid operands to binary %

Предполагая, что в Isnt компилятор на наркотики, что не так с этим?

РЕДАКТИРОВАТЬ: В качестве стороннего, что я на самом деле хотел сделать, это обнаружить нецелое значение и округлить. То, что я должен был делать звали roundf (и я предполагаю, что проверка, если возврат меньше операнда, а затем увеличивающееся если это так, чтобы позаботиться о том, мы облавах)

+2

Ответ уже есть. Еще один вопрос: «Почему не работает над float_? пожалуйста, посмотрите на [why-do-moduleulus-division-only-work-with-integers?] (http://stackoverflow.com/questions/6102948/why-does-modulus-division-only-work-with- integers) –

+3

Чтобы округлить, если есть ** какая-либо ** ненулевая часть дроби, используйте 'ceilf', а не' roundf'. Примечание: 'ceilf' округляется к бесконечности; если вы хотите, чтобы отрицательные числа округлились до -инфиниции (например, от -3,25 до -4), вам понадобится дополнительный код. –

+0

@EricPostpischil thats почти точно, что я хочу. Я не имею его на моей цели, хотя, поэтому я предполагаю, что это двойная версия 'ceil' для меня ... – mjs

ответ

12

% является целым числом оператора - использовать fmod или fmodf для парных или поплавков.

В качестве альтернативы, если вы ожидаете, что ваш поплавок для представления целых значений а затем преобразовать его в int первых, например .:

if ((int)someFloat % 2 == 1) // if f is an odd integer value 
{ 
    ... 
} 
+1

Да, я так и не знал. Только делал это 15 лет ... Просто посмотрел на мой надежный старый K & R, и это так. – mjs

+1

30 лет для меня и до сих пор учатся ... ;-) –

+1

@PaulR как с практически любой другой наукой, мы никогда не сможем полностью изучить язык. :) –

3

Оператор модуль работает только с целыми числами. Для значений с плавающей запятой используйте fmod или fmodf.

+1

@downvoter (мы оба знаем, кто вы): Привет всем! Это было действительно зрело. – Jon

1

% это работает только с целыми числами использовать FMOD для плавающей запятой или двойных значений **

double fmod(double x, double y) 


x -- This is the floating point value with the division numerator i.e. x. 

y -- This is the floating point value with the division denominator i.e. y. 
Смежные вопросы