< p >
printf
函数的 %g
能够在浮点数为3.00时显示整数3
,并且如果浮点数不是一个整数,它会显示3.01
。
如果不将数字格式化成字符串,你该如何通过代码实现这一点?
printf
函数的 %g
能够在浮点数为3.00时显示整数3
,并且如果浮点数不是一个整数,它会显示3.01
。
如果不将数字格式化成字符串,你该如何通过代码实现这一点?
在浮点数和双精度格式中,整数值确实具有精确的表示。因此,如果它已经是整数,您可以使用:
f == floor(f)
然而,如果你的值是计算的结果,并且其中某个点涉及任何非零小数部分,那么你需要担心可能存在一个非常接近于整数但实际上并不完全相同的情况。你可能想要将其视为整数。
一种可能的方法是:
fabs(f - round(f)) < 0.000001
提到这个话题时,对于纯粹主义者,我们应该注意,int i = f;
或double i = f;
将根据FPU模式进行四舍五入,而round(3)会将半路上的情况向远离零的方向四舍五入。
<cmath>
中定义的常量FLT_EPSILON
、DBL_EPSILON
和LDBL_EPSILON
非常方便。 - fish2000nextafter(1.0, +inf) - 1
,即在1.0-1.9999的指数值处为1ulp,但对于任何更大的数量级,它都小于尾数中最后一位的1个单位。因此,除了零(当向下到0.9999999...时),它是双倍数与整数之间可能存在的最小差异量。但对于接近任何其他整数的数字,它比最小舍入误差还要小。浮点错误通常是相对的,而不是绝对的,因为该格式保留了固定数量的有效数字(以二进制表示)。 - Peter Cordes