#include
#include <math.h> double Round(const double Value,
/*保留到小數點後第ADigit位*/
const short int ADigit,
/*RoundMark為保留方式,默認值應當為0,即執行常規的四舍五入*/
/*-1表示取不大於當前數的帶ADigit位小數的最大數值,即無條件舍去*/
/* 1表示取不小於當前數的帶ADigit位小數的最大數值,即無條件收上*/
const short int RoundMark
)
{
char LocalRoundMark=RoundMark;
double Result=Value;
double DResult;
double DigitValue; if(ADigit>18||ADigit<-18)/*由於pow函數的限制,ADigit不能超過±18*/
return Result; DigitValue=pow(10,ADigit);/*取10的ADigit次方*/ /*LocalRoundMark只有三種狀態值,等於0,小於0*/
if(LocalRoundMark>0)
LocalRoundMark=1;
if(LocalRoundMark<0)
LocalRoundMark=-1; switch(LocalRoundMark)
{
case -1:/*取不大於當前Value的帶ADigit位小數的最大數值*/
Result*=DigitValue;
Result=(Value<0.0)?ceil(Result):floor(Result);
break; case 1:/*取不小於當前Value的帶ADigit位小數的最大數值*/
Result*=DigitValue;
Result=(Value<0.0)?floor(Result):ceil(Result);
break; default:/*四舍五入*/
if(Value<0.0)
Result-=0.5/DigitValue;
else
Result =0.5/DigitValue;
Result*=DigitValue;
DResult=Result; if(Value<0.0)
{
Result=ceil(Result);
DResult=Result-DResult;
/*此處為浮點誤差值,理論值為1*/
/*但是實際可能達不到1,而用ceil後會由此產生誤差值*/
/*而後就需要做調整*/
if(DResult>0.99999995)
Result-=1.0;
}
else
{
Result=floor(Result);
DResult-=Result;
/*此處為浮點誤差值,理論值為1*/
/*但是實際可能達不到1,而用foor後會由此產生誤差值*/
/*而後就需要做調整*/
if(DResult>0.99999995)
Result =1.0;
}
}
Result/=DigitValue;
return Result;
}
發表人 - unsigned 於 2005/08/24 12:25:21