在声明一个float类型的变量时,是否有必要在值的末尾写入f?例如,浮点数= 0.01和浮点数= 0.01f,这里的f是什么意思,它有什么区别?此外,这里的#include库文件的作用是什么。
答案 0 :(得分:5)
没有必要:编译器将为您进行适当的数值转换。
0.01f
是float
类型的文字,而0.01
是double
类型的。
有时您需要明确描述,尤其是在使用模板或重载函数时:
void foo(const float&){
// Pay me a bonus
}
void foo(const double&){
// Reformat my disk
}
int main(){
foo(1.f);
}
最后,如果您打算在float
上使用double
,请通读以下内容:Is using double faster than float?
答案 1 :(得分:2)
这取决于您如何定义变量。在定义中指定类型float
时,无需添加结尾f
:
float amount = 0.1; /* This is fine, compiler knows the type of amount. */
在您重复类型信息时,在此处添加多余的文字(float amount = 0.1f;
)甚至可能被认为是不好的做法,当更改类型时会导致更多的编辑。
但是在类型推导的上下文中,您必须提供f
文字:
auto amount = 0.1f; /* Without the literal, compiler deduces double. */
还有更多的微妙的上下文可以进行类型推导,例如
std::vector<float> vecOfFloats;
/* ... */
std::accumulate(vecOfFloats.cbegin(), vecOfFloats.cend(), 0.1f);
在这里,第三个参数用于推导std::accumulate
所使用的类型。如果您像std::accumulate(..., 0.1);
这样称呼它,则vecOfFloats
中的每个元素都会进行从浮点到双精度的转换。
答案 2 :(得分:0)
.01
是double
文字。初始化期间会隐式转换为float
float amount = .01;
.01f
是float
文字。初始化没有转换
float amount = .01f;
答案 3 :(得分:0)
这取决于... 您可以例如:
1)
float f = 3.14f;
在这种情况下,文字3.14被明确指定为浮点数...因此一切正常
2)
float f = 3.14;
在这种情况下,3.14实际上是一个双精度型,但变量f被声明为float值,因此在编译时,该数字将被强制转换为float值,从而导致这种情况下的精度损失。
从c ++ 11起您就可以使用
auto f = 3.14;
或自动f {3,14};
在这两种情况下,编译器均采用字面量的类型...(均为双精度型)