2012-04-13 97 views
9

讓我們看一下Java中的以下語句。用Java中的DecimalFormat舍入

System.out.println(new DecimalFormat("0").format(2.4)); //returns 2 

System.out.println(new DecimalFormat("0").format(2.5)); //returns 2 <---Concentrate here 
System.out.println(Math.round(2.5));     //returns 3 

System.out.println(new DecimalFormat("0").format(2.6)); //returns 3 
System.out.println(new DecimalFormat("0").format(3.5)); //returns 4 

在上述聲明中,除了以下所有情況,其他所有情況都很明顯。

System.out.println(new DecimalFormat("0").format(2.5)); 

它應該返回3但它返回2。怎麼樣?

回答

9

這是故意的行爲。從the documentation

四捨五入

DecimalFormat的使用半連取整(請參閱ROUND_HALF_EVEN)進行格式化。

關於ROUND_HALF_EVEN

舍入模式朝着「近鄰」,除非兩個相鄰數字的距離相等,在這種情況下,輪對,甚至鄰居。如果丟棄部分左邊的數字是奇數,則表現爲ROUND_HALF_UP;表現爲ROUND_HALF_DOWN,如果它是偶數。請注意,這是在一系列計算中重複應用時最小化累積誤差的舍入模式。

這也被稱爲銀行家的四捨五入。

在另一方面Math.Round使用下面的公式,這是「正常」的舍入:

(long)Math.floor(a + 0.5d) 
14

DecimalFormat默認舍入模式是RoundingMode.HALF_EVEN。這意味着它會四捨五入,或者如果數字更接近下一個鄰居,則舍入。當這個數字恰好在兩個鄰居之間(在你的情況下,是2和3)時,它會變成最接近的偶數(在你的情況下,2)。

正如你所看到的,當你與3.5試了一下,四捨五入到4

如果你想要更多的「直覺」的行爲,呼籲setRoundingMode(RoundingMode.HALF_UP) http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html#setRoundingMode(java.math.RoundingMode)

這是一樣的HALF_EVEN,但是如果這個數字恰好在兩個鄰居之間,將總是向上舍入。