※ 引述《caxz ( )》之铭言:
: 问题三
: int main()
: {
: float a = 0.7;
: if(a > 0.7) cout<< "C" <<endl;
: else cout<< "C++" <<endl;
: //以上这段印出C++
: if(a < 0.7)
: cout<< "C" <<endl;
: else
: cout<< "C++" <<endl;
: //以上这段印出C
: }
: 这看似简单但我却想不通....有什么到原因是这样的output ??
____
0.7 无法以二进制有限小数表示, 将其转为二进制是为 0.10110
因此实际上电脑看到的不是 0.7, 而是依照其精确度留存的二进制近似值
取 float 切 24 位有效位数会得到 0.101100110011001100110011 | 0...
因此这个 a 变量实际上存的值是二进制的 0.101100110011001100110011
而单写 0.7 其形态为 double, 切 53 位有效位数得
0.10110011001100110011001100110011001100110011001100110 | 0...
因此 a 跟 0.7 比较即是比较下列两数的大小:
a 0.101100110011001100110011
0.7 0.10110011001100110011001100110011001100110011001100110
由此 a < 0.7 会成立
: 后来又被问到 如果 a 的行型态被改为 double 呢?
: 我刚刚是try了一下 结果都是C++
: 为何会有这种改变呢?
这时这两个数都是 double 的那个 0.7
所以两者相等, 两个不等的比较都不成立