3

在 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");
} 

它打印“否”。

这是什么原因?浮点数据类型如何工作?

4

2 回答 2

11

问题是那a是一个float,但是0.7是一个double。分配到的值a从 转换doublefloat,这会丢失精度。当您比较adouble,a扩大到 a double,但精度已经丢失,它们可能不再相等。

如果您更改0.7and 1.7to0.7f然后1.7f它们将被转换为文字,并且在两种情况下float都会可靠地比较等于。a

于 2013-07-04T18:04:10.010 回答
1

数据类型适用于float近似值。C/C++ 中的每种数字数据类型都使用有限的、固定数量的字节来存储值。float以指数格式存储值,如果您将另一种格式的值传递给它,该值将被四舍五入......然后,如果您在小数点分隔符之后查看足够多的数字,您肯定会看到非零价值观。而且1.7,正如彼得亚历山大在回答中所说,它不是“纯”浮点值。

对这种设计背后的动机的进一步详细解释可能太长了,无法在这里回答——但如果你在谷歌上搜索它,你可能会阅读更多相关信息。其中一位评论者 Luchian 在那里留下了一个很好的链接:http ://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2013-07-04T18:05:09.013 回答