C 的整数舍入

Integer rounding in C++

本文关键字:舍入 整数      更新时间:2023-10-16

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

sector_latitude的答案应为13,对于sector_Longitudity,答案分别为11,但分别为12和10。

在C 中,整数未舍入。相反,整数划分截断(读:始终向零圆)。

的其余部分。

如果您想获得正面整数的圆形效果,则可以写下:

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

添加0.5导致截断产生圆形效果。请注意,在10.0上添加.0以在添加之前强制浮点划分。

我还假设sector_latitude是带有铸件的INT。

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"(a int)告诉编译器使用浮点算术。如果涉及double之类的浮点值,它总是选择浮点而不是整数计算。

尽管此线程非常旧,但我很难看到两个现有答案转换为浮点,然后返回整数。如果您想将n除以d并将商圆向最近的整数(所有这些都使用Integer-finly Arithmetic),那么您只需在分配之前添加d/2

q = (n + d/2) / d

(当然,d/2可以编写d>>1,但是编译器将为您做到这一点。)因此,如果n为19,而d为4,则确切的商为4.75,n/d将产生4(Truncation to Zero),但是上面的公式将产生5,这是所需的结果。对于OP中给出的示例,只需如下更新最后两行:

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

编辑:已指出(谢谢, @kees-jan),如果n和CC_17和d具有不同的符号,则该解决方案将无法工作,从而产生负数。以下是一个更完整的解决方案,它仍然避免了昂贵的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);