整齐的错误舍入

时间:2019-03-27 09:40:02

标签: c++ rounding clang-tidy

整理整洁[bugprone-incorrect-roundings]的文档说:

  

数字0.499999975(小于0.5的最小可表示浮点数)四舍五入为1.0

据我所知,socket.io以下的最小浮点数是0.5,而不是0.4999999702。但是尽管如此,天真的舍入计算中的两个数字give me 0 values

0.499999975

我想念什么吗?

1 个答案:

答案 0 :(得分:3)

关于标准中的算术转换:

  

6.3.1.8常规算术转换

     

...

     
      
  • 否则,如果一个操作数的对应实型为double,则将另一个操作数转换为对应实型为double的类型,而不会改变类型域。

  •   
  • 与类型所要求的精度和范围相比,浮点操作数的值和浮点表达式的结果的表示精度可能更高;

  •   

所以在这一行:

(int)(v1+0.5) 

您的v1变量被提升为双精度浮点运算,这就是为什么您得到零的原因。

这应该可以解决您的问题:

#include <iostream>

int main() {

    const float v1 = 0.499999975f;
    const float v2 = 0.4999999702f;

    std::cout << (int)(v1 + 0.5f) << "\n" 
              << (int)(v2 + 0.5f) << "\n";
}