C中的整数舍入

新手上路,请多包涵

我试图在 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。

原文由 user3064203 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 325
1 个回答

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

 q = (n + d/2) / d

(Of course, d/2 could be written d>>1 , but the compiler will do that for you.) So, if n is 19 and 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),如果 n 如果 nd 有不同的标志,则此解决方案将不起作用从而产生负商。下面是一个更完整的解决方案,它仍然避免了昂贵的 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);

原文由 Pablo Halpern 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题