在處理一些資料時,我們希望能用「四捨五入」法實現,但是c#採用的是「四捨六入五成雙」的方法,如下面的例子,就是用「四捨六入五成雙」得到的結果:
double d1 = math.round(1.25, 1);
double d2 = math.round(1.24, 1);
double d3 = math.round(1.26, 1);
double d4 = math.round(1.35, 1);
為了用c#來實現「四捨五入」,我寫了下面的函式:
/// /// 實現資料的四捨五入法
///
/// 要進行處理的資料
/// 保留的小數字數
/// 四捨五入後的結果
private double round(double v, int x)
int ivalue = 1;
for (int i = 1; i <= x; i++)
double int = math.round(v * ivalue + 0.5, 0);
v = int / ivalue;
if (isnegative)
return v;
}
經過簡單的測試,上面的函式能實現對資料的四捨五入法。
math.round ()在四捨五入時有個問題:
math.round(2.5,0) = 2;
math.round(3.5,0) = 4;
2.5應該等於3才對!
在asp中也存在這個問題,不過asp中還有個formatnumber可以用,但目前還不知道怎麼使用?
解釋:math.round()準確的說,這個函式不是四捨五入,而是四捨六入五湊偶,就是說小於4或大於6的該舍該入是沒有爭議的,而5處在正中間,如果四捨五入則會造成資料的整體偏差,所以採取的原則是:如果捨入位為5,則捨入後最後一位為偶數,這是國際慣例。
現在做的專案都要5入,解決方法:
目前做法是:
如:(3.45*10+0.5)取整,再除以10
c# 中沒有四捨五入函式,事實上我知道的程式語言都沒有四捨五入函式,因為四捨五入演算法不科學,國際通行的是 banker 捨入法 banker 's rounding(銀行家捨入)演算法,即四捨六入五取偶。事實上這也是 ieee 規定的捨入標準。因此所有符合 ieee 標準的語言都應該是採用這一演算法的
math.round 方法預設的也是 banker 捨入法 在 .net 2.0 中 math.round 方法有幾個過載方法
math.round(decimal, midpointrounding)
math.round(double, midpointrounding)
math.round(decimal,
int32, midpointrounding)
math.round(double,
int32, midpointrounding)
將小數值捨入到指定精度。midpointrounding 引數,指定當乙個值正好處於另兩個數中間時如何捨入這個值
該引數是個 midpointrounding 列舉
此列舉有兩個成員:
awayfromzero 當乙個數字是其他兩個數字的中間值時,會將其捨入為兩個值中絕對值較大的值。
toeven 當乙個數字是其他兩個數字的中間值時,會將其捨入為最接近的偶數。
所以,要實現四捨五入函式,對於正數,可以加乙個 midpointrounding.awayfromzero 引數指定當乙個數字是其他兩個數字的中間值時其捨入為兩個值中絕對值較大的值,例:
math.round(3.45, 2, midpointrounding.awayfromzero)
不過對於負數上面的方法就又不對了
因此需要自己寫個函式來處理
double chinaround(double value, int decimals)
else
}
有些時候不一定要用四捨五入的,可能需要上取整或下取整:
math.ceiling()和math.floor
math.ceiling(3.1)=4;
math.floor(3.9)=3;
取天板值與地板值,與
"四捨五入"無關。其實floor的結果與(int)相同,因此也可以這樣寫math.floor((
double)2/3+0.5)
floor 和 ceil是math unit 裡的函式,使用前要先 uses math。
trunc 和 round 是system unit 裡的函式,預設就可以用。
floor 直接往小的取,比如 floor(-123.55)=-124,floor(123.55)=123
trunc 直接切下整數,比如 trunc(-123.55)=-123, floor(123.55)=123
ceil 直接往大的取,比如 ceil(-123.55)=-123, ceil(123.55)=124
round 計算四捨五入,比如 round(-123.55)=-124,round(123.55)=124
c#取整函式向上取整例項
int a = 5;
int b = 2;
lbl.text = convert.tostring(math.ceiling((double)a / (double)b));
四捨五入 上取整 下取整
float tmpfloatdata2 3.7 nsstring tmpstr2 nsstring stringwithformat 0f tmpfloatdata2 nslog tmpstr2 tmpstr2 結果為4 float tmpfloatdata3 6.5 nsstring tmpstr...
c 四捨五入 上取整 下取整
在處理一些資料時,我們希望能用 四捨五入 法實現,但是c 採用的是 四捨六入五成雙 的方法,如下面的例子,就是用 四捨六入五成雙 得到的結果 double d1 math.round 1.25,1 double d2 math.round 1.24,1 double d3 math.round 1....
C 四捨五入 上取整 下取整
在處理一些資料時,我們希望能用 四捨五入 法實現,但是c 採用的是 四捨六入五成雙 的方法,如下面的例子,就是用 四捨六入五成雙 得到的結果 double d1 math.round 1.25,1 1.2double d2 math.round 1.24,1 1.2double d3 math.ro...