为什么会这样?没有你明确地做铸造

时间:2015-07-29 13:34:41

标签: c++ casting

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;

2 个答案:

答案 0 :(得分:1)

doublefloat之间的比较得到float隐式转换为double。这意味着您的a==b被解释为(double) a == b

4.5的小数部分是2的精确幂:0.5 == 2 -2 。该值以二进制浮点格式精确

表示
4.5 dec = 100.1 bin

它在doublefloat中都得到了精确表示。因此,比较结果会比较4.54.5,结果为true

4.2需要{em>无限周期性的2幂来表示。

4.2 dec = 100.0011001100110011... bin = 100.(0011) bin

因此,它仅在doublefloat中表示 - 无限序列以某种方式被修剪。由于float的精确度低于double,因此float中存储的值最终会与double中存储的值不同。在double中,您会得到类似4.1999998092651367的内容,而在float中,您会获得类似4.2000000000000002的内容。转换为double中的(double) a == b无法使值“匹配”,结果为false

答案 1 :(得分:0)

浮点变量无法准确表示所有值。特别是,值0.10.2(十进制)无法准确表示,只有近似值存储在变量中。

double类型的变量将比float更精确地存储这些值(即它会给出更好的近似值)。所以这两个值不相等。

要理解,请理解浮点变量通常与基数2(二进制分数)一起使用。然后尝试在基数2中表示1/10(十进制)。结果是无限系列。这是同样的现象,导致1/3以十进制表示为0.33333 ....(无穷多位数)。唯一的区别在于,在二进制中,一组不同的值具有无限多个数字。其中一个受影响的值是1/10。