发布完全版四舍五入函数,绝对只得收藏!!!
自己经过研究,利用c库函数编写一个完全版四舍五入函数,和c的sprintf打印浮点数值相同的,
欢迎大家讨论并提出意见。
double round(double _x,int decimalnum)
{
//参数:数、保留小数位数
//说明:该函数只关心保留小数位数的后一位,与sprintf函数相同
// 例: round(0.499,2)=0.50 round(0.4949,2)=0.49
double num,dec,factor;
dec = modf(_x,&num); //分切整数与小数部分(不直接用long型数参与计算,
避免运算溢出)
factor= pow(10,decimalnum); //因子
dec *=factor; //小数点右移decimalnum位
dec +=_x>=0 ? 0.5:-0.5; //四舍五入运算
modf(dec,&dec); //取整
dec/=factor; //小数点左移decimalnum位
return num + dec; //合并返回值
};
有的网友运算过程中用int或long进行取整来实现,严格的来说是错误的(即使你的算法是对的),
因为int或long 是有数值上下限2^31的,这样的函数如果求66666666666666.66的四舍五入会发生
溢出错误(尤其重要,因为我们编写的浮点数精度四舍五入运算)