代码之家  ›  专栏  ›  技术社区  ›  ScottyMacDev

在Visual C++中,如何将浮点值舍入到指定的精度?[副本]

  •  0
  • ScottyMacDev  · 技术社区  · 7 年前

    我正在构建一个具有极坐标系和笛卡尔坐标系以及三维坐标系的世界。我的坐标都表示为浮点数。我开始写测试,然后从那里开始编码。一切都很好,直到我开始尝试精确的数值,然后我开始出现问题。

    下面是一个示例测试:

    TEST_METHOD(TestAngleFromPointUsingRelativeCoordsQuandrant1_1)
    {
       // ARRANGE
       TwoDCoordinate testPoint = TwoDCoordinate(10, 10);
       PolarCoordinate expected = PolarCoordinate(45.0F, 14.142136F);
    
       // ACT
       PolarCoordinate actual = CoordinateConverter::ConvertFrom2DToPolar(testPoint);
       TwoDCoordinate convertedCoord = CoordinateConverter::ConvertFromPolarTo2D(actual, TwoDCoordinate(0.0F, 0.0F));
    
       // ASSERT
       ActAndAssertOnConversion(expected, actual);
    }
    

    14.142136的值对我来说太精确了,14.142就可以了。所以我去研究了更多的std方法,发现了std::stof。基于此,我编写了此函数:

    float BaseTester::RoundFloatTo(float fnum, int round_digits)
    {
         std::string::size_type sz;
         std::ostringstream oss;
         oss << std::fixed << std::showpoint;
         oss << std::setprecision(round_digits);
         oss << fnum;
         std::string buffer = oss.str();
         return std::stof(buffer, &sz);
    }
    

    我以为我的麻烦已经过去了,直到我看到精度从5到0的输出。对于浮动14.142136,我得到:

    1. 5 = 14.1421404
    2. 4 = 14.1421003
    3. 3 = 14.1420002
    4. 2 = 14.1400003
    5. 1 = 14.1000004
    6. 0 = 14.0000000

    这根本不是我所期望的!我希望数字的数量会随着精度的降低而减少,并适当地向上或向下取整。这样地:

    1. 5 = 14.14214
    2. 4 = 14.1421
    3. 3 = 14.142
    4. 2 = 14.14
    5. 1 = 14.1
    6. 0 = 14.0

    很明显我做错了什么,有人有什么好主意吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ext3h    7 年前

    你方存在多重误解:

    • 设置精度仅适用于浮点渲染的方式 buffer . 不适用于 float 您正在将其投射回。
    • 当返回到时 浮动 您再次受到舍入错误的影响。
    • 实际上,你要做的是检查两个数字之间是否存在一定的偏差。这与舍入无关。