检查float是否是一个整数

我怎样才能检查一个floatvariables是否包含一个整数值? 到目前为止,我一直在使用:

 float f = 4.5886; if (f-(int)f == 0) printf("yes\n"); else printf("no\n"); 

但是我想知道是否有更好的解决scheme,或者这个解决scheme有没有什么缺点。

除了已经给出的很好的答案,你也可以使用ceilf(f) == fceilf(f) == f floorf(f) == f 。 如果f是一个整数,则两个expression式都返回true 。 他们也为NaN返回false ( NaNs总是比较不等 ),并且对于±无穷大是正确的,并且不存在溢出用于保存截断结果的整数types的问题,因为ceilf() / ceilf()返回float s。

请记住,这里的大多数技术都是有效的,假设由于事先计算的舍入误差不是一个因素。 比如你可以使用roundf ,就像这样:

 float z = 1.0f; if (roundf(z) == z) { printf("integer\n"); } else { printf("fraction\n"); } 

这个和其他类似技术(如ceilf ,cast to long等)的问题是,虽然它们对于整数常量很有效,但是如果这个数字是浮点运算的计算结果,点四舍五入错误。 例如:

 float z = powf(powf(3.0f, 0.05f), 20.0f); if (roundf(z) == z) { printf("integer\n"); } else { printf("fraction\n"); } 

即使(3 1/2020应该等于3,打印“分数”,因为实际计算结果是2.9999992847442626953125

任何类似的方法,无论是fmodf还是其他方法,都会受到这个限制。 在执行复杂计算或四舍五入计算的应用程序中,通常您要做的是为构成“整数”(这适用于浮点相等比较)定义一些“容差”值。 我们经常把这个公差称作epsilon 。 例如,可以说我们会原谅计算机达到+/- 0.00001舍入误差。 那么,如果我们正在testingz ,我们可以select一个0.00001的epsilon,并做:

 if (fabsf(roundf(z) - z) <= 0.00001f) { printf("integer\n"); } else { printf("fraction\n"); } 

你真的不想在这里使用ceilf ,因为例如ceilf(1.0000001)是2而不是1,而ceilf(-1.99999999)是-1而不是-2。

如果你愿意,你可以使用rintf代替roundf

select一个适合您的应用的容差值(是的,有时零容差是适当的)。 有关更多信息,请参阅比较浮点数的文章。

stdlib float modf(float x,float * ipart)分成两部分,检查返回值是否小数部分== 0。

 if (fmod(f, 1) == 0.0) { ... } 

不要忘记math.hlibm

 if (f <= LONG_MIN || f >= LONG_MAX || f == (long)f) /* it's an integer */ 

我不是100%确定的,但是当你将f赋给一个int并从f中减去它时,我相信它会变回浮点数。 在这种情况下,这可能无关紧要,但是如果您预期由于某种原因而成为整数,则可能会出现问题。

我不知道这是否是一个更好的解决scheme本身,但你可以使用模数运算,例如: float f = 4.5886; bool isInt; isInt = (f % 1.0 != 0) ? false : true; float f = 4.5886; bool isInt; isInt = (f % 1.0 != 0) ? false : true; 取决于你的编译器你可能不需要.0之后的1,再一次隐含的casts的东西发挥作用。 在这段代码中,如果小数点的右边全为零,则bool isInt应该为真,否则为false。

 #define twop22 (0x1.0p+22) #define ABS(x) (fabs(x)) #define isFloatInteger(x) ((ABS(x) >= twop22) || (((ABS(x) + twop22) - twop22) == ABS(x))) 

那么最近我遇到了这个问题,出乎意料地在网上find了这个解决scheme。 所以这里是我的解决scheme。 例如 – 如果值是3.00,我们只需要3,那么我们需要检查是否在“。”之后。 有零或不。 如果它可以被转换为int,否则它仍然是浮动的。 所以包括这个function

 int isInt(float val) { int i = (int) val; if( i != val) return 0; // its not an integer else return 1; // is an integer } int main() { float i = 3.9; // not this is an example. if(isInt()) printf("%d", i); else printf("%f", i); return 0; } 

希望能帮助到你!

http://anandkhinvasara.com/check-whether-number-integer-float-c/