我正在构建一个具有极坐标和笛卡尔坐标系以及三维坐标系的世界。我的坐标都表示为浮点数。我开始编写测试,然后从那里编码。一切都很好,直到我开始测量精确值,然后我开始遇到问题。
以下是一个示例测试:
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我得到了:
这不是我期待的!我希望数字的位数会随着精度的降低而降低,并适当地向上或向下舍入。像这样:
显然我在这里做错了,有人对我有好主意吗?
答案 0 :(得分:0)
您身边存在多重误解:
buffer
的方式。不要将float
投回去。float
时,您再次遇到舍入错误。