#8
有看到C语言中使用如下的一段代码,讨论讨论
typedef double FLOAT;
typedef FLOAT *P_FLOAT;
typedef unsigned int U32;
方法一:按部就班
/*
* 对调整系数值进行小数点截位
* @f : 待处理的浮点数(即为入口参数,也为出口参数)
* @bits: 保留的小数点后位数
*/
void round_float(P_FLOAT f,int bits) {
static const int DECIMAL_BASE = 10;
U32 n,scale,m;
int i;
scale = 1;
for (i=0;i/*多乘1位,手动四舍五入*/
scale *= DECIMAL_BASE;
n = (*f) * scale;
m = n % 10;
/*手动四舍五入*/
if (m <5)
n = n - m;
else
n = n - m +10;
*f = ((FLOAT)n /scale);
}
方法二:尾数进位判断
void round_float(P_FLOAT f,int bits) {
static const int DECIMAL_BASE = 10;
U32 n,scale,m;
int i;
scale = 1;
for (i=0;i
scale *= DECIMAL_BASE;
scale *= 2;
/*
*此法比较巧妙,本质来说还是判断
*待舍入的目标小数为是大等于5还是小于5.
*/
n = (*f) * scale;
/*
* 当目标小数大等于5,n值各位必然为奇数
* 因为该位上的数x2后造成进位,而进位前的
* 乘积为偶数,两数相加为奇数.否则不进位,为偶
*/
n += (n % 2);
*f = ((FLOAT)n /scale);
}