Проверка, является ли данное число целым числом - PullRequest
5 голосов
/ 04 октября 2011

Я пытаюсь реализовать пользовательскую функцию, которая проверяет, является ли число целым числом:

#include <iostream>
#include <typeinfo>
using namespace std;
bool   integer(float k){
                  if (k==20000) return false;;
                  if (k==(-20000)) return  false;
 if (k==0)  return true;
   if (k<0)  return integer(k+1);
   else if(k>0)  return integer (k-1);
   return false;
}
int main(){

    float s=23.34;
       float s1=45;
       cout<<boolalpha;
       cout<<integer(s)<<endl;
       cout<<integer(s1)<<endl;
       return 0;

}

Таким образом, идея в том, что, если число является целым числом, не имеет значения, является ли оно отрицательным или положительным, если мы уменьшаем или увеличиваем его на единицу, мы должны получить ноль, но проблема в том, что как мы можем создать верхнюю и нижнюю границы для увеличения и уменьшения?

Ответы [ 9 ]

24 голосов
/ 04 октября 2011
#include <cmath>

bool is_integer(float k)
{
  return std::floor(k) == k;
}

Это решение должно работать для всех возможных значений k.Я почти уверен, что это тот случай, когда вы можете безопасно сравнивать числа с плавающей запятой, используя ==.

. Попробуйте вдумчиво назвать функции.integer не дает никакого представления о том, что на самом деле делает , поэтому я изменил имя функции на что-то более значимое.

В будущем, тестирование числа на целое должно почувствуйте как очень простую операцию, поэтому у вас должно быть сильное ощущение, что лучшее решение будет очень простым.Надеюсь, вы понимаете, что ваше оригинальное решение абсурдно по многим причинам (главная причина: в большинстве случаев это приведет к переполнению стека).

11 голосов
/ 04 октября 2011

Почему бы просто не сделать что-то вроде этого:

bool integer(float k)
{
    return k == (float)(int)k;
}

(Конечно, не стесняйтесь использовать правильные приведения типа C ++.)

5 голосов
/ 04 октября 2011

Это не сработает, так как для достаточно больших чисел с плавающей запятой, x-1 == x.

Вы должны проверить битовую комбинацию с плавающей запятой, чтобы проверить, равна ли дробная часть 0.

1 голос
/ 12 сентября 2017

Мы могли бы использовать метод trunc из math.h

#include <math.h>

inline bool IsInt(float n)
{
    return !(n - trunc(n));
}
1 голос
/ 04 октября 2011

его макрос limit.h установлен в INT_MAX (для максимума) или INT_MIN (для минимума) для целых чисел

правильный ответ

 bool integer(float k)
    {
        if( k == (int) k) return true;
        return false;
    }
0 голосов
/ 28 мая 2018

Я использовал это:

float a;
cin>>a;
int b=a;
float c=b/a; //can subtract too
if (c==1)      //just change to 0
{
    cout<<"Is integer";
}
else
{
    cout<<"not an integer";
}

Тупой, но работает!

0 голосов
/ 17 января 2018

Скачать следующий заголовочный файл
checkVar.h
теперь напишите ваш исходный код cpp как

#include <iostream> 
#include "checkVar.h"
using namespace std;
int main(){
int num;
cout << "Enter a number : ";
cin >> num;
if (check.ifInt(num)==1)
{
cout << "Integer";
}else{
cout << "Not integer";
}
/*
You can also check for float by using check.ifFloat(num) 
*/
}

Обратите внимание, что вы должны хранить checkVar.h вместе с вашим активным исходным файлом cpp:)

0 голосов
/ 11 января 2018

Ну, а почему не только это?

#include <iostream>
using namespace std;
bool is_integer(float check){
        if (int(check) == check)
                return true;
        else return false;
}
int main()
{
        float input;
        cin >> input;
        if (is_integer(input))
        cout << endl << "It's an integer";
        else cout << endl <<" Not an integer";
        return 0;
}
0 голосов
/ 04 октября 2011

Вы можете просто использовать усиленный лексический заголовок приведения

  bool isinteger(float k){
  try{ 
      int tmp = boost::lexical_cast<int>(k);
      (void*) tmp;
      return true;
  }catch(boost::bad_lexical_cast &c){
  return false;
  }  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...