这是有问题的代码:
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个),只有这三个声明会生成警告。
谁能告诉我区别,我该怎么解决?
答案 0 :(得分:2)
通过添加f
来指定您的文字是浮点数。因此,一行如下所示:
static const float SMALL_BINDING_TARGET_SIDE = 10.f;
没有f的情况下,文字将被解释为双精度,并且如果二进制表示形式的浮点精度更长,则可能会截断文字。
不会发生这种情况,因为高两位可以不用很多位就可以用二进制表示,因此可以不截断地放入浮点数中。
答案 1 :(得分:1)
前两个文字可以用float完全表示。实际上,整数中的第一个是二的幂。当您指定的值导致二进制表示形式时,如果不截断某些位就无法放入float中,则会出现警告。从double转换为float是昂贵的,在任何其他情况下,您都希望避免使用它。
您可以通过传递浮点文字来抑制警告,例如1.33f
会生成最接近您指定值的浮点表示形式。