float a = 4.2 ;
double b = 4.2 ;
if(a==b)
cout<<"True";
else
cout<<"False";
结果为&#34; False&#34; 。 但是当我宣布a和b为,
float a = 4.5;
double b =4.5 ;
它给出结果&#34; True&#34;
这里发生了什么?任何人都可以解释它,并且在给出时不会重复作为值和#34; 4.5&#34;或&#34; 4.0&#34;它会导致&#34; True&#34;
答案 0 :(得分:1)
double
和float
之间的比较得到float
隐式转换为double
。这意味着您的a==b
被解释为(double) a == b
。
4.5
的小数部分是2
的精确幂:0.5 == 2 -2 。该值以二进制浮点格式精确
4.5 dec = 100.1 bin
它在double
和float
中都得到了精确表示。因此,比较结果会比较4.5
到4.5
,结果为true
。
4.2
需要{em>无限周期性的2
幂来表示。
4.2 dec = 100.0011001100110011... bin = 100.(0011) bin
因此,它仅在double
和float
中表示 - 无限序列以某种方式被修剪。由于float
的精确度低于double
,因此float
中存储的值最终会与double
中存储的值不同。在double
中,您会得到类似4.1999998092651367
的内容,而在float
中,您会获得类似4.2000000000000002
的内容。转换为double
中的(double) a == b
无法使值“匹配”,结果为false
。
答案 1 :(得分:0)
浮点变量无法准确表示所有值。特别是,值0.1
和0.2
(十进制)无法准确表示,只有近似值存储在变量中。
double
类型的变量将比float
更精确地存储这些值(即它会给出更好的近似值)。所以这两个值不相等。
要理解,请理解浮点变量通常与基数2(二进制分数)一起使用。然后尝试在基数2中表示1/10(十进制)。结果是无限系列。这是同样的现象,导致1/3以十进制表示为0.33333 ....(无穷多位数)。唯一的区别在于,在二进制中,一组不同的值具有无限多个数字。其中一个受影响的值是1/10。