浮点值比较失败

时间:2013-07-04 17:56:26

标签: c++ c

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

打印“否”。

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

2 个答案:

答案 0 :(得分:11)

问题是afloat,但0.7double。分配到a的值会从double转换为float,这会失去精确度。将a与[{1}}进行比较后,double会扩展为a,但精度已经丢失,并且它们可能不再相等。

如果您将double0.7更改为1.70.7f,那么它们将转换为1.7f文字并且可靠地比较等于{{1}在这两种情况下。

答案 1 :(得分:1)

float数据类型适用于近似值。 C / C ++中的每种数字数据类型都使用有限的固定数量的字节来存储值。 float以指数格式存储值,如果您将另一种格式的值传递给它,则值将被舍入...然后,如果您查看超过小数分隔符的足够数字,您确定看到非零值。正如彼得亚历山大在答案中所说的那样1.7并不是一个“纯粹的”浮动值。

对于这种设计背后的动机的进一步详细解释可能对于asnwer来说太长了 - 但是如果你谷歌的话,你可能会阅读更多关于它的信息。其中一位评论者Luchian在那里留下了一个很好的联系:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html