C ++警告:在一个声明中初始化从double到float的截断,但在另一个声明中不初始化

时间:2018-08-30 11:11:07

标签: c++

这是有问题的代码:

static const float SMALL_BINDING_TARGET_SIDE =              10;
static const float SMALL_BINDING_TARGET_HS =                0.25;
static const float SMALL_BINDING_TARGET_HL =                2.6;
static const float SMALL_BINDING_TARGET_VS =                1.33;
static const float SMALL_BINDING_TARGET_VL =                3.54;

问题是我的编译器(在MVSC 2017中使用Qt)抛出此警告:

warning: C4305: 'initializing': truncation from 'double' to 'float'

在下面三行中,但不在上面两行中。此外,我总共有16个完全像这样的声明(包括上面代码中的5个),只有这三个声明会生成警告。

谁能告诉我区别,我该怎么解决?

2 个答案:

答案 0 :(得分:2)

通过添加f来指定您的文字是浮点数。因此,一行如下所示:

static const float SMALL_BINDING_TARGET_SIDE =              10.f;

没有f的情况下,文字将被解释为双精度,并且如果二进制表示形式的浮点精度更长,则可能会截断文字。

不会发生这种情况,因为高两位可以不用很多位就可以用二进制表示,因此可以不截断地放入浮点数中。

答案 1 :(得分:1)

前两个文字可以用float完全表示。实际上,整数中的第一个是二的幂。当您指定的值导致二进制表示形式时,如果不截断某些位就无法放入float中,则会出现警告。从double转换为float是昂贵的,在任何其他情况下,您都希望避免使用它。

您可以通过传递浮点文字来抑制警告,例如1.33f会生成最接近您指定值的浮点表示形式。