近日,發現小數四捨五入寫代碼有問題,遂網絡上查了下資料,記錄下來以便日後查詢。
原理:放大數據,再利用運算符的優先級處理。
1.首先,得知道,運算優先級,括號→轉換→乘除加減。
#include <stdio.h>
long powe(long n);
int main(void)
{
long t; //過渡量
long i = 3; //精度,小數點後幾位。
float h = 11.5555; //需要進行四捨五入的數
t = (long)((h*powe(i+1)+5)/10.0);
h = (float)t/powe(i);
printf("%f",h);
return 0;
}
long powe(long n) //平方
{
long x=1;
if(n>0)
x = 10*powe(--n);
else
return 1;
return x;
}
㈡加法實現:
#include <stdio.h>
double powe(double n);
int main(void)
{
double x = 11.55556666; //需四捨五入的數
double i = 3; //精度
double y = 0; //結果
y = 0.01*1.0/powe(i)*(int)(100.0*powe(i)*(x+0.005*1.0/powe(i)));//默認小數點後一位
printf("%f",y);
return 0;
}
double powe(double n)
{
--n;
double s = 0;
if(--n>0)
s = 10*powe(--n);
else
return 1;
return s;
}
總結:
以上兩種方式都是針對小數點後幾位進行四捨五入,第一種方式優點在於負數也能進行,第二種則不能。但需注意的是,在第一種方式中隱形轉換對其影響大,個人推薦使用第二種方式。