检查float是否是一个整数
我怎样才能检查一个float
variables是否包含一个整数值? 到目前为止,我一直在使用:
float f = 4.5886; if (f-(int)f == 0) printf("yes\n"); else printf("no\n");
但是我想知道是否有更好的解决scheme,或者这个解决scheme有没有什么缺点。
除了已经给出的很好的答案,你也可以使用ceilf(f) == f
或ceilf(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/20 ) 20应该等于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.h
和libm
。
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/