C# 四捨六入五成雙

  • 1574
  • 0

不小心踩到一個小雷,希望不要有人像我一樣QQ

前言:

最近系統上線,前陣子客戶提出一個問題,就是為什麼有些報表的金額都會少一塊,都沒有四捨五入...

明明就是使用.NET提供的System.Math這個方法,為什麼有些金額就是不會四捨五入?

例如:Math.Round(21850.5) 就是不會進位...

參考官方文件的說法之後,原來.NET針對四捨五入的case是採用四捨六入五成雙的方式,而非一般認知的四捨五入。

注意:今天這種不會四捨五入的case會發生在小數點剛好是介於兩個整數之間的時候(如0.5)

簡單來說就是一個數值如果四捨五入之後是奇數則會直接捨去小數點,也不會進位(例:2.5在四捨六入之後會變成2),反之才會進位(例:3.5在四捨六入之後會變成4)

一些處理方式,正常的四捨五入:

  • 使用ToString()來制定數值顯示格式
  • 使用Math.Round (Double, MidpointRounding)官方的說法如下:

 

參考資料

  1. 藍色小鋪 - C#沒有四捨五入?只有五捨六入的涵數?
  2. MidpointRounding 列舉(System) - MSDN - Microsoft