C++如何优雅地将浮点数向上取整

问题来源

今天写排序算法的时候,遇到了一个问题:
将一个奇数分成两份,第一份向下取整,第二份向上取整,例如7分成两份,第一份为3,第二份是4。

解决过程

这个问题本来应该很好解决,第一份正常除,因为C++本身的运算就是向下取整的,第二份用一下ceil函数,加一个math库就好,代码如下:

int a = 7;//这个就是要分开的数
cout << a / 2 << " "//第一份
	 << ceil((double)a / 2);//第二份

但是我脑子抽抽了, 觉得ceil的速度有些慢了,放到排序里面会拖慢整体速度,这个时候,还有一种选择,那就是第二份直接加1,比如这样:

int a = 7;//这个就是要分开的数
cout << a / 2 << " "//第一份
	 << a / 2 + 1;//第二份除完直接加1就好了

但是!但是但是,我这个小可爱又开始找茬了 ,觉得这样做不够优雅,有失代码健壮性,顺带再整一个更方便的办法,不用math库,甚至不用if语句就可以向上取整。

办法总比困难多,我突然想到有一个运算符可以代替if,那就是C++的三元运算符"? :"
实现的大概原理就是先判断输入进来的数是否是整数,如果不是整数就直接向下取整(直接double转int就好)然后加1,否则直接输出
话不多说,上代码!

代码

首先,下面这段代码是可以直接插入程序里的,不需要任何额外的头文件和预处理,开盖即食:

double RoundingNum = 123.00001;
cout << (((double)RoundingNum - (int)RoundingNum == 0) ? (int)RoundingNum : (int)RoundingNum + 1);

如果你需要更加优雅的实现方式,可以直接用一个define:

#define RoundNum(RoundingNum) (((double)RoundingNum - (int)RoundingNum == 0) ? (int)RoundingNum : (int)RoundingNum + 1)

这段代码的用法和ceil函数是一样的:

double a = 123.00001;
cout << RoundNum(a);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值