#include <stdio.h>
main()
{
float f = 0.1;
if (f == 0.1)
printf("True");
else
printf("False");
}
输出:
False
为什么打印False
而非True
?
答案 0 :(得分:4)
您不应该使用!=
来检查float
!
代码等于检查if (0.1f == 0.1)
,因为促销和转化规则意味着比较发生在双数之间。十进制数0.1表示为单精度浮点数和双精度双精度数(并且这两个表示都不精确),因此当0.1f被提升为double时,结果与double有很大不同代表0.1。
你应该使用
if (fabs(f-0.1) < 0.001) // for 0.001, can be other suitable precisions
P.S。:要继续阅读,请查看What Every Computer Scientist Should Know About Floating-Point Arithmetic。
答案 1 :(得分:3)
典型的浮点并不完全代表精确到0.1的数字。
0.1
是double
,只有几乎数值0.1 - 见下文。将其分配给float
会进一步降低精度。
float f = 0.1;
// Convert 0.1 to a `double`. closest double is 0.10000000000000000555
// Assigned that double to a float: closest float is 0.10000000149011611938
最后将此与0.1的高精度double
版本进行比较会导致不匹配。
if (f == 0.1) // does not compare as equal
// compare f which is 0.10000000149011611938 to
// 0.10000000000000000555 and they are not equal.
实施例
volatile float f = 0.1;
printf("%.20f\n", f);
// 0.10000000149011611938
volatile double d = 0.1;
printf("%.20f\n", d);
// 0.10000000000000000555
答案 2 :(得分:1)
您可以使用
if(f-0.1<=accuracy)
答案 3 :(得分:1)
不要对浮点数使用(in)相等性 - 它们存储为不精确的数字 - 这就是浮点数的来源
写
if (fabsf(f - 0.1) < precision) ...
precision
是您需要的准确度
参见fabs(3) 和What Every Computer Scientist Should Know About Floating-Point Arithmetic