既然您看到了我对您链接的问题的回答,让我们完成它并进行必要的更改以检查您的第二种情况:
在二进制中,1.7 是:
b1.1011001100110011001100110011001100110011001100110011001100110...
但是,1.7 是一个双精度字面量,其值是 1.7 舍入到最接近的可表示双精度值,即:
b1.1011001100110011001100110011001100110011001100110011
在十进制中,这正是:
1.6999999999999999555910790149937383830547332763671875
当您编写 float a = 1.7 时,该双精度值再次四舍五入为单精度,并且 a 获取二进制值:
b1.10110011001100110011010
这正是
1.7000000476837158
十进制(注意它是四舍五入的!)
当您进行比较 (a < 1.7) 时,您正在将此单精度值(转换为双精度值,它不会四舍五入,因为所有单精度值都可以用双精度表示)与原始双精度值进行比较。因为
1.7000000476837158 > 1.6999999999999999555910790149937383830547332763671875
比较正确返回 false,并且您的程序打印“false”。
好的,那么为什么 0.7 和 1.7 的结果不同呢?这一切都在四舍五入。单精度数有 24 位。当我们用二进制写下 0.7 时,它看起来像这样:
b.101100110011001100110011 00110011...
(第 24 位之后有空格来显示它的位置)。因为第 24 位之后的下一个数字是零,所以当我们四舍五入到 24 位时,我们向下舍入。
现在看 1.7:
b1.10110011001100110011001 10011001...
因为我们有前导1.
,第 24 位的位置移动,现在第 24 位之后的下一个数字是 1,我们改为四舍五入。