4

我试图在 C++ 中使用下面的公式。我将两个变量都声明为整数,我希望它们四舍五入,但它们似乎正在四舍五入。我已经查看了这个,但似乎无法找到问题所在。任何帮助将不胜感激。

int user_degrees_latitude, user_degrees_longitude;
const int lat_const=(-90)
const int long_const=(-180)

sector_latitude = (user_degrees_latitude - lat_const) / (10);
sector_longitude = (user_degrees_longitude - long_const) / (10);

扇区纬度的答案应该是 13,扇区经度的答案应该是 11,但计算机分别将每个向下舍入到 12 和 10。

4

3 回答 3

9

在 C++ 中,整数不四舍五入。相反,整数除法会截断(阅读:总是向零舍入)除法的其余部分。

如果你想获得整数的舍入效果,你可以写:

sector_latitude = static_cast<int>(((user_degrees_latitude - lat_const) / (10.0)) + 0.5);

添加 0.5 会导致截断产生舍入效果。请注意添加.0on10.0以在添加之前强制进行浮点除法。

我还认为这sector_latitude是一个 int 与铸造。

于 2014-01-22T00:25:40.160 回答
3

C++ 中的整数除法总是向零舍入。使用浮点除法获得“精确”结果并std::round根据正常规则使用四舍五入:

sector_latitude = static_cast</*type of sector_latitude*/>( std::round( (user_degrees_latitude - lat_const) / 10.0 ));

“10.0”(a double)而不是“10”(an int)告诉编译器使用浮点运算。如果涉及像 a 这样的浮点值,它总是选择浮点而不是整数计算double

于 2014-01-22T00:26:50.170 回答
0

虽然这个线程很老,但我很遗憾看到两个现有的答案都转换为浮点数,然后又转换回整数。如果您想将商除以nd四舍五入到最接近的整数,全部使用仅整数算术,那么您只需d/2在除法之前添加:

q = (n + d/2) / d

(当然,d/2可以写成d>>1,但编译器会为你做。)所以,如果n是 19 并且d是 4,则确切的商将是 4.75,n/d将产生 4(截断为零),但上面的公式将产生 5 ,这是想要的结果。对于 OP 中给出的示例,只需将最后两行更新如下:

sector_latitude = (user_degrees_latitude - lat_const + 5) / (10);
sector_longitude = (user_degrees_longitude - long_const + 5) / (10);

编辑:有人指出(感谢@kees-jan),如果nifnd具有不同的符号,则此解决方案将不起作用,从而产生负商。下面是一个更完整的解决方案,它仍然避免了昂贵的 int-float-int 转换:

constexpr int div_round(int n, int d)
{
    int offset = (((n < 0) == (d < 0)) ? d : -d) / 2;
    return (n + offset) / d;
}

sector_latitude = div_round(user_degrees_latitude - lat_const, 10);
sector_longitude = div_round(user_degrees_longitude - long_const, 10);
于 2022-01-30T23:05:09.437 回答