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

C++ 测试给定的数字是否为整数,c++,numbers,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;

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

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

}
#包括
#包括
使用名称空间std;
布尔整数(浮点k){
如果(k==20000)返回false;;
如果(k==(-20000))返回false;
如果(k==0),则返回true;
if(k0)返回整数(k-1);
返回false;
}
int main(){
浮动s=23.34;
浮点数s1=45;

cout这是行不通的,因为对于足够大的浮动,
x-1==x


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

为什么不这样做:

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


(当然可以使用适当的C++类型)<< /P> < P>极限,h宏集为整数(最大)或整数最小(最小)为整数

正确答案

 bool integer(float k)
    {
        if( k == (int) k) return true;
        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(浮点k){
试试{
inttmp=boost::词法转换(k);
(无效*)tmp;
返回true;
}捕获(boost::bad\u词法\u cast&c){
返回false;
}  
#包括
bool是_整数(浮点k)
{
返回标准::楼层(k)=k;
}
这个解决方案应该适用于
k
的所有可能值。我非常确定,在这种情况下,您可以使用
=
安全地比较浮动

尝试对函数进行仔细命名。
integer
没有给出它实际作用的任何线索,因此我将函数名更改为更有意义的名称

将来,测试一个数字是否是整数应该感觉像是一个非常简单的操作,因此您应该有一种强烈的感觉,即最好的解决方案将非常简单。我希望您意识到您的原始解决方案由于许多原因是荒谬的(最大的原因:在绝大多数情况下,它将导致堆栈溢出).

我们可以使用math.h.中的方法

#include <math.h>

inline bool IsInt(float n)
{
    return !(n - trunc(n));
}
#包括
内联布尔IsInt(浮点n)
{
返回!(n-trunc(n));
}

那么,为什么不仅仅是这个呢

#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;
}
#包括
使用名称空间std;
布尔为整数(浮点检查){
if(int(check)=check)
返回true;
否则返回false;
}
int main()
{
浮点输入;
cin>>输入;
if(是_整数(输入))

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

#包括
bool是_整数(浮点n){
int c=细胞(n);
int f=楼层(n);
如果(f==c){
返回true;
}否则{
返回false;
}
}

下面是您问题的工作代码

bool isInteger( double num )
{
    int n = int(num);
    if ( num - n == 0 ) {
        return true;
    }
    return false;
}
现在,我将借助两个案例来解释我的代码

bool isInteger( double num )
{
    int n = int(num);
    if ( num - n == 0 ) {
        return true;
    }
    return false;
}
案例1:给定要检查的数字=1.10。因此num=1.10,n=1。但是现在num-n=0.10,这不等于0。因此代码结果为false



案例2:给定要检查的数字=1。因此num=1和n=1。但是现在num-n=0,这等于0。因此代码结果为true!

此外,这里应该避免递归,它是一种非常慢的方法,而不仅仅是对于| x |->inf…,x+/-1==x,并且几乎在每种情况下都会导致堆栈溢出。你真的建议他在他的函数中使用这些常量?你看到它做什么了吗?不,用户要求上限和下限……-所以我给出了相应的答案……我甚至不……你为什么认为20000?是的,你是对的。我已经用Max和In MyIntNO.TeN4改变了它,我是关于数论的讨论部分,在这里讨论了主题A。关于(二次)留数和素数留数的根等等,这里有一个算法,它在某种程度上涉及到整数项,如果某个东西的平方根是整数,那么它就是根,所以它是主要的原因读者:有一个新的和,明确考虑到C++11。注意,对于足够大的整数,它返回
false
(比如1e100)。(并不是说用户想要的实际上在一般意义上是可以通过浮点实现的。)真的(除了你不能将1e100表示为一个单精度浮点!)-我想它对于>99%的用例来说已经足够好了。@Mat:事实上,对于足够大的
k
(大小大于约
INT_MAX
)。有兴趣使用增压功能如果该
楼层
双层(双)楼层,则此功能可能不起作用
中定义。调用此
floor
k
转换为double,函数将以double形式返回floor。在此处使用
float floorf(float)
更好,使用
std::floor(float)更好
来自
。另一个潜在的问题区域是负数,其中
楼层
从零开始舍入。最安全的解决方案是
返回标准::楼层(标准::abs(k))==标准::abs(k)
。为什么会出现问题?如果它是整数,就不会被取整。如果它不是整数,则取整到哪里并不重要,只要它不等于原始值,它就不可能是整数。对于
std::numeric\u limits::infinity()
答案的要点
int(检查)==检查
已经出现在其他答案中,并且没有添加任何新内容OK!我的错,我没有看到其他帖子。--你好,你能为你的答案添加解释吗?虽然只有代码的答案可能会回答这个问题,但你可以通过为你的代码提供上下文来显著提高答案的质量,这也是为什么会出现这种情况的原因de works,以及一些文档参考以供进一步阅读。From:“简洁是可以接受的,但更完整的解释更好。”好的,谢谢各位,我将添加一些评论
bool isInteger( double num )
{
    int n = int(num);
    if ( num - n == 0 ) {
        return true;
    }
    return false;
}