在 C 中,如果我们执行以下代码:
float a = 0.7;
if (a < 0.7)
{
printf("Less");
}
else
{
printf("no");
}
代码上面的代码打印“Less”。
但是如果我们执行下面的代码:
float a = 1.7;
if (a < 1.7)
{
printf("Less");
}
else
{
printf("no");
}
它打印“否”。
这是什么原因?浮点数据类型如何工作?
问题是那a
是一个float
,但是0.7
是一个double
。分配到的值a
从 转换double
为float
,这会丢失精度。当您比较a
回double
,a
扩大到 a double
,但精度已经丢失,它们可能不再相等。
如果您更改0.7
and 1.7
to0.7f
然后1.7f
它们将被转换为文字,并且在两种情况下float
都会可靠地比较等于。a
数据类型适用于float
近似值。C/C++ 中的每种数字数据类型都使用有限的、固定数量的字节来存储值。float
以指数格式存储值,如果您将另一种格式的值传递给它,该值将被四舍五入......然后,如果您在小数点分隔符之后查看足够多的数字,您肯定会看到非零价值观。而且1.7
,正如彼得亚历山大在回答中所说,它不是“纯”浮点值。
对这种设计背后的动机的进一步详细解释可能太长了,无法在这里回答——但如果你在谷歌上搜索它,你可能会阅读更多相关信息。其中一位评论者 Luchian 在那里留下了一个很好的链接:http ://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html