由于舍入误差,大多数浮点数最终会稍微不精确。只要这种不精确性很小,通常可以忽略不计。然而,这也意味着预期相等的数字(例如,当通过不同的正确方法计算相同的结果时)通常会略有不同,并且简单的相等性测试会失败。
在您的情况下,将 a 转换为double
会float
失去一些精度。
比较浮点数时必须非常小心。
我建议你看看这个链接:浮点和双重比较最有效的方法是什么?
这篇文章可以帮助你理解它为什么附加:http ://www.cprogramming.com/tutorial/floating_point/understanding_floating_point_representation.html
关于浮点数的一点解释以及为什么会这样:
浮点数通常作为符号位、指数字段和有效位(尾数)从左到右打包到计算机数据中。
基本上,您可以说浮点数是:
number = (sign ? -1:1) * 2^(exponent) * 1.(mantissa bits)
当然,根据您使用的是float还是double,精度会有所不同:
| Sign | Exponent | Significand | Total bits
float | 1 | 8 | 23 | 32
Double | 1 | 11 | 52 | 64
在这里,您可以了解为什么将双精度数转换为浮点数可能会丢失一些数据。
在您的情况下,计算机似乎能够精确计算 3.5,但不能精确计算 3.3。不知何故,使用公式,我们可能会假设您正在执行以下操作:
3.3333333 == 3.333333333333333 // is false because of the precision
3.5000000 == 3.500000000000000 // is true
// I tried to match the precision of the float in the left
// and the precision of the double on the right