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

dat*_*ili 5 c++ numbers

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

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

}
Run Code Online (Sandbox Code Playgroud)

所以我的想法是,如果一个数是一个整数,如果它是负数或正数无关紧要,如果我们减少或增加它,我们必须得到零,但问题是,我们怎样才能创建增减的下界?

ten*_*our 24

#include <cmath>

bool is_integer(float k)
{
  return std::floor(k) == k;
}
Run Code Online (Sandbox Code Playgroud)

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

尝试仔细命名功能.integer没有提供任何线索它实际上做了什么,所以我将函数名称更改为更有意义的东西.

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

  • 为什么会导致问题?如果它是积分的,它将不会四舍五入.如果它不是*积分,只要它不等于原始值就不会在哪里变得圆整,这是不可能的. (7认同)

Pau*_*l R 11

为什么不做这样的事情:

bool integer(float k)
{
    return k == (float)(int)k;
}
Run Code Online (Sandbox Code Playgroud)

(当然可以随意使用正确的C++类型转换.)


qua*_*dev 5

对于足够大的花车,这是行不通的x-1 == x.

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

  • ...几乎在每种情况下都会导致堆栈溢出. (2认同)