我的代码是
void main()
{
float a = 0.7;
if (a < 0.7)
printf("c");
else
printf("c++");
}
它打印C
,这很好,因为a
被视为双常数值,其值将0.699999
小于0.7
。
现在,如果我将0.1,0.2,0.3
中的值更改为0.9
中的a
以及if condition
,那么除了C++
之外,它还会打印0.7 and 0.9
这意味着两者都相等或者更大。
为什么这个概念不考虑所有价值?
答案 0 :(得分:11)
你在说什么“概念”?
您提到的所有数字都不能精确地以二进制浮点格式表示(无论精度如何)。您提到的所有数字最终都会在点之后具有无限个二进制数字。
由于float
和double
都不具有无限精度,因此float
和double
格式的实现将代表大约这些值,很可能通过最近的可表示的二进制浮点值。 float
和double
的这些近似值会有所不同。并且近似float
值可能最终大于或小于近似double
值。因此,您观察到的结果。
例如,在我的实现中,0.7
的值表示为
+6.9999998807907104e-0001 - float
+6.9999999999999995e-0001 - double
同时0.1
的值表示为
+1.0000000149011611e-0001 - float
+1.0000000000000000e-0001 - double
正如您所看到的,double
表示在第一个示例中大于float
表示,而在第二个示例中,它是另一种方式。 (以上是十进制表示法,它们本身是四舍五入的,但是它们有足够的精度来充分说明效果。)