-2

来自http://www.cprogramming.com/tips/tip/difference-between-float-and-double

在 c++ 中,任何像 4.12 这样的值都默认被视为双精度值。比较浮点数和双精度数可能是一项棘手的工作,因为精度差异会导致微小的错误。例如:

float a = 4.12;

if(a == 4.12)
{
    cout << "hello";
}
else
{
    cout << "bye";
}

这会将输出显示为“bye 4.12”

为什么?

因为默认情况下 4.12 是一个双精度数(例如在 if 语句中或在我们的变量的赋值中),但是将它存储在一个浮点数中它会失去一些精度,因此将双精度数与浮点数进行比较会导致在数字的精度——请记住,浮点数和双精度数并不精确。

这里有两个教训:一个是大多数时候不应该直接比较浮点数,另一个是硬编码浮点数的默认大小和类型是 double。

问题是'你不应该比较浮点变量和双常量'。

所以我的问题是比较浮点变量和浮点常量后跟“f”可以吗?

像这样的东西。

if(a == 4.12f)
4

1 回答 1

1

比较浮点变量和浮点常量后跟“f”可以吗?

它仍然很危险。与您的float/double示例不同,对于 的每个可能值都可能失败,a实际上有一个值afor which a == 4.12fwill be true,但取决于您的设置方式,即使您期望它a也可能不匹配。4.12f例如:

#include <iostream>
#include <iomanip>

int main()
{
    float f = 4.14;
    f -= 0.01;
    f -= 0.01;
    std::cout << std::boolalpha << (f == 4.12f) << '\n';
}

ideone.com 上,这里输出:

false

该标准确实保证在某些情况下将使用最接近的表示,因此如果您直接分配,float a = 4.12f;那么之后a == 4.12f必然是true,并且 § 26.5.1.4 保证如果您a将文本流出来并将其流回另一个float,它们将在之后比较等于.

无论如何,如果你觉得你必须依赖这样的东西,请检查标准/文档以了解你正在考虑的具体用法。

于 2015-04-07T05:53:32.960 回答