国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#編程實現四舍五入、向上及下取整的方法

2020-01-24 01:23:04
字體:
來源:轉載
供稿:網友

本文實例講述了C#編程實現四舍五入、向上及下取整的方法。分享給大家供大家參考,具體如下:

在處理一些數據時,我們希望能用“四舍五入”法實現,但是C#采用的是“四舍六入五成雙”的方法,如下面的例子,就是用“四舍六入五成雙”得到的結果:

double d1 = Math.Round(1.25, 1);//1.2double d2 = Math.Round(1.24, 1);//1.2double d3 = Math.Round(1.26, 1);//1.3double d4 = Math.Round(1.35, 1);//1.4

為了用C#來實現“四舍五入”,我寫了下面的函數:

代碼

/// <summary>/// 實現數據的四舍五入法/// </summary>/// <param name="v">要進行處理的數據</param>/// <param name="x">保留的小數位數</param>/// <returns>四舍五入后的結果</returns>private double Round(double v, int x){  bool isNegative = false;  //如果是負數  if (v < 0)  {   isNegative = true;   v = -v;  }  int IValue = 1;  for (int i = 1; i <= x; i++)  {   IValue = IValue * 10;  }  double Int = Math.Round(v * IValue + 0.5, 0);  v = Int / IValue;  if (isNegative)  {   v = -v;  }  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) {  if (value < 0)  {   return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero);  }  else  {   return Math.Round(value, decimals, MidpointRounding.AwayFromZero);  } } 

有些時候不一定要用四舍五入的,可能需要上取整或下取整:

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)); 

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临泉县| 盘锦市| 噶尔县| 阿拉善盟| 临江市| 乾安县| 丰镇市| 娄烦县| 大悟县| 大石桥市| 怀仁县| 吴川市| 得荣县| 芮城县| 双柏县| 三台县| 襄城县| 盐山县| 镇雄县| 伊通| 威信县| 旌德县| 县级市| 彭水| 商城县| 江西省| 永胜县| 多伦县| 清河县| 宿迁市| 偏关县| 抚松县| 丰台区| 甘洛县| 沁阳市| 台安县| 长乐市| 湘阴县| 新密市| 苍梧县| 洪湖市|