整数除法表达式被隐式强制转换为浮点类型。
除法是使用整数运算执行的,这会在被赋予浮点型结果类型之前截断小数部分。 此检查并非总是指示出现问题,因为有时截断是故意的。
在 Visual Studio 2022 中,lnt-integer-float-division 检查是由 C/C++ 代码样式选项中的“截断除法结果”设置控制的。 有关如何更改此设置的信息,请参阅配置 Linter。
在 Visual Studio 2019 中,lnt-integer-float-division 检查通过 C/C++ 代码样式选项中的“整数除法转换为浮点数”设置进行控制。 有关如何更改此设置的信息,请参阅配置 Linter。
示例
float divide(int i, int j) {
return i / j; // Flagged: The integer division result is implicitly cast to float.
}
float half(int i) {
return i / 2; // Flagged: An integer literal is used.
}
如何解决此问题
Linter 建议的解决方法是将除法运算的操作数之一显式强制转换为浮点类型,以确保除法结果不会被截断。 还可以使用浮点文本,而不使用强制转换。
float divide(int i, int j) {
return static_cast<float>(i) / j;
}
float half(int i) {
return i / 2.0;
}
备注
如果截断是有意为之的,可以添加显式类型转换以避免警告。
float int_divide(int i, int j) {
return static_cast<float>(i / j); // Not flagged because of the explicit cast.
}