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