来自http://www.cprogramming.com/tips/tip/difference-between-float-and-double:
在c ++中,默认情况下,4.12之类的任何值都被视为double。 比较浮动和双打可能是一个棘手的业务,因为 精度差异导致微小错误。例如:
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)
答案 0 :(得分:1)
比较float变量和float常量后跟'f'是否正确?
它仍然很危险。与float
/ double
示例相比,a
的每个可能值都可能失败,实际上a
的值为a == 4.12f
true
{ {1}},但根据您设置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 here上输出:
false
标准保证在某些情况下会使用最接近的表示形式,因此如果您直接指定float a = 4.12f;
,那么之后a == 4.12f
必然是true
,并且§26.5.1.4保证如果您流出a
并将文本流回到另一个float
,那么他们将在之后比较等于。
无论如何,如果您认为必须依赖此类内容,请查看标准/文档以了解您正在考虑的具体用法。