SQL server和C#,VB.net中Round方法的差異

來源:互聯網
上載者:User

在C#中使用Math.Round(1.25, 1),期望得到1.3,結果卻是1.2。
1.因為Math.Round方法並不是遵循四捨五入的原則,而是採用“四捨六入五成雙”這種方式,若需要舍入到的位的後面"小於5"或"大於5"的話,按通常意義的四捨五入處理.若"若需要舍入到的位的後面"等於5",則要看舍入後末位為偶數還是奇數,舉例:
Math.Round(1.25, 1) = 1.2 因為5前面是2,為偶數,所以把5捨去不進位
Math.Round(1.35, 1) = 1.4 因為5前面是3,為奇數,所以進位
而0也看成為偶數,所以Math.Round(0.5, 0) = 0

2.從統計學的角度,"四捨六入五成雙"比"四捨五入"要科學,它使舍入後的結果有的變大,有的變小,更平均.而不是像四捨五入那樣逢五就入,導致結果偏向大數.
例如:1.15+1.25+1.35+1.45=5.2,若按四捨五入取一位小數計算
1.2+1.3+1.4+1.5=5.4
按"四捨六入五成雙"計算,1.2+1.2+1.4+1.4=5.2,舍入後的結果更能反映實際結果 3.在C#和VB.net,都是"四捨六入五成雙"原則,而 Sql Server 是簡單的"四捨五入"。
但是如果單獨對一個數進行四捨五入,這種方法明顯是不行的,因為Math.Round(0.5, 0) = 0,所以需要另外自己寫一個方法去實現,下面是在我們項目中用的方法,供大家參考:C#代碼 
  1. public staticdecimal Round(decimal d,int decimals)  
  2. {  
  3. decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals));  
  4. decimal scrD = d * tenPow + 0.5m;  
  5. return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);  
public static decimal Round(decimal d, int decimals){ decimal tenPow = Convert.ToDecimal(Math.Pow(10, decimals)); decimal scrD = d * tenPow + 0.5m; return (Convert.ToDecimal(Math.Floor(Convert.ToDouble(scrD))) / tenPow);}
另外,如果小數位足夠長,也可以Decimal.Round這個方法,舉例:
Decimal.Round(1.25, 1) = 1.2
但是如果是 Decimal.Round(1.251, 1) = 1.3
所以採用下面的方法也能達到四捨五入的效果 C#代碼 
  1. public staticdecimal MyDecimalRound(decimal d,int
    decimals)  
  2. {  
  3. d = d + 0.000000000000001m;  
  4. return Decimal.Round(d, decimals);  
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.