c语言:四舍五入

对于正的浮点数,最简单的四舍五入方法就是用这样的一个表达式

(long) (x+0.5)

但是如果表达式对负数有效的话会更好,即使在你看来负数的情况不会发生。这意味着你可以用一个条件表达式:

x >= 0 ? (long)(x+0.5) : (long)(x-0.5)

这个表达式的返回值就是与浮点变量 x 的值最接近的整数值。

如果需要大量地使用舍入转换,则可以写这样的一个宏:

#define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

这可以在某种程度上使代码更具可读性。

注意到这样的转换会将 1.5 变为 2 但却将 -1.5 变为 -2,那么对于这样正好处于两个整数之间的浮点数,你可能需要做一些其它的处理,但这在实际当中并不十分重要。

需要小心的是,将一个浮点数转换为一个整型数可能导致上溢,但大多数的实现都没有进行相关的判断。用 long 替代 int 会给出一个更宽的范围(建议使用 long),但仍然比浮点数的范围要小得多。

如果效率不是至关重要的话,则可以定义这样的一个函数(而不是简单地写一个 #define),使你的程序更具鲁棒性:

long round(double x) {

assert(x >= LONG_MIN-0.5);

assert(x <= LONG_MAX+0.5);

if (x >= 0)

return (long) (x+0.5);

return (long) (x-0.5);

}

如果在意效率的话,可以写这样一个宏

#define round(x) ((x) < LONG_MIN-0.5 || (x) > LONG_MAX+0.5 ?\

error() : ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

这要求在程序中有 #include <limits.h>,并且有一个处理错误的函数 error,其返回值为 long 类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值