C 的整数舍入
Integer rounding in 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);
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);
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- 将整数舍入到另一个整数的最接近的倍数
- 在与C 双打中存储的大整数时,如何避免舍入/精确错误
- 是整数舍入规则决定了 C++、python3 和 python2.7 之间的 % 操作差异吗?
- 实现整数除法向上舍入的正确方法是什么?
- 如何将数字向上舍入到下一个整数
- 将浮点值向上舍入为整数,这有多可靠
- 用MPFR舍入整数
- C 的整数舍入
- 将浮点数转换为整数时如何舍入
- C++ 将特殊浮点值舍入为整数
- 不带逻辑运算符的舍入整数除法
- 误差C++舍入数字 - 表达式必须具有整数或枚举类型
- 使用整数除法减少舍入错误