测试给定的数字是否为整数

Testing if given number is integer

本文关键字:是否 整数 数字 测试      更新时间:2023-10-16

我正在尝试实现用户定义的函数,该函数测试数字是否为整数:

#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;
}

意思是,如果一个数是整数,无论它是正数还是负数,无论它是递增还是递增,结果都是0,但问题是,我们如何创建递增和递减的上界和下界呢?

#include <cmath>
bool is_integer(float k)
{
  return std::floor(k) == k;
}

这个解决方案应该适用于所有可能的k值。我很确定这是一个可以使用==安全地比较浮点数的情况。

尽量周到地命名函数。integer没有给出任何线索它实际上,所以我把函数名改为更有意义的东西。

对于将来,测试一个数字是否为整数应该让感觉像一个非常简单的操作,所以你应该有一个强烈的感觉,最好的解决方案将非常简单。我希望你意识到你最初的解决方案是荒谬的,有很多原因(最大的原因:在绝大多数情况下,它会导致堆栈溢出)。

为什么不这样做呢:

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

?

(当然可以随意使用适当的c++类型强制转换)

对于足够大的浮点数x-1 == x,这是行不通的。

您应该测试浮点数的位模式来检查小数部分是否为0

它的in limit.h宏设置为整数的INT_MAX(最大值)或INT_MIN(最小值)

正确答案

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

我们可以使用math.h

中的trunc方法
#include <math.h>
inline bool IsInt(float n)
{
    return !(n - trunc(n));
}

我想到了一个更简单的方法。
考虑一个浮点数,比如1.5。这个数的下限(即1)和这个数的上限(即2)是不同的。对于任何包含小数部分的值都是如此。
另一方面,整数的floor和ceiling值是相同的。因此,检查数字的上限和下限值很容易,因此,看看它是否是一个整数。

#include <cmath>
bool is_integer(float n){
 int c = ceil(n);
 int f = floor(n);
 if(f==c){
  return true;
 } else {
  return false;
 }
}

可以直接使用boost词法强制转换头

  bool isinteger(float k){
  try{ 
      int tmp = boost::lexical_cast<int>(k);
      (void*) tmp;
      return true;
  }catch(boost::bad_lexical_cast &c){
  return false;
  }  

下面是您的问题的工作代码。

bool isInteger( double num ) {
    int n = int(num);
    return (num - n == 0);
}

现在我将尝试用两个极端情况的例子来解释我的代码。

Case 1: 给定要检查的号码= 1.10。因此num = 1.10, n = 1。现在,num - n = 0.10这个不等于0。因此,代码的结果是false!

Case 2: 给定要检查的号码= 1。因此num = 1和n = 1。现在,num - n = 0,这个等于0。因此代码的结果是true!

为什么不这样呢?

#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;
}