数据类型浮点

时间:2018-07-13 09:37:02

标签: c++

在声明一个float类型的变量时,是否有必要在值的末尾写入f?例如,浮点数= 0.01和浮点数= 0.01f,这里的f是什么意思,它有什么区别?此外,这里的#include库文件的作用是什么。

4 个答案:

答案 0 :(得分:5)

没有必要:编译器将为您进行适当的数值转换。

0.01ffloat类型的文字,而0.01double类型的。

有时您需要明确描述,尤其是在使用模板或重载函数时:

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)

.01double文字。初始化期间会隐式转换为float

float amount = .01;

.01ffloat文字。初始化没有转换

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};

在这两种情况下,编译器均采用字面量的类型...(均为双精度型)