2013-03-12 94 views
5

下面的代碼,它使用RoundingMode.HALF_EVEN舍入模式的BigDecimal在Java中

BigDecimal value1 = new BigDecimal("4.5"); 
value1=value1.setScale(0, RoundingMode.HALF_EVEN); 

BigDecimal value2 = new BigDecimal("6.5"); 
value2=value2.setScale(0, RoundingMode.HALF_EVEN); 

System.out.println(value1+"\n"+value2); 

顯示器分別46。在我看來,它應該分別顯示57,因爲丟棄的小數部分(在本例中爲5)左邊的數字是奇數。在這種情況下,它執行RoundingMode.HALF_UP

並要在RoundingMode.HALF_UP情況下,RoundingMode.UP是當丟棄小數部分是> = 0.5(其爲真)進行,否則RoundingMode.DOWN被執行。

+0

'4'和'6'是'ROUND_HALF_EVEN'中的'EVEN'。 '.5'是'HALF'部分。 – 2013-03-12 02:36:38

+2

對於後代,我不得不閱讀幾次以獲得它。一個對我來說很有意義的例子是,如果你四捨五入,那麼你距離6和7的距離相等。因爲6是平的,所以你選擇了那個。 – 2014-07-16 20:07:09

回答

13

行爲在Javadoc被很好地描述:

舍入模式向「最接近的」 除非兩個 鄰居的距離相等,在這種情況下,圓向着甚至 鄰居

所以給出的數字4.5,這屬於正確的數字4和5之間的範圍的中間,當你撥打:

BigDecimal value1 = new BigDecimal("4.5").setScale(RoundingMode.ROUND_HALF_EVEN); 

運行時需要弄清楚圓其鄰居太,也就是說,它應該是4還是5?通常它會基於哪個值4.5更接近,但在這種情況下其接近都是鄰居。它不是隨意挑選最終結果,而是選擇偶數。這是ROUND_HALF_EVEN的行爲。如果你想,你可以指定ROUND_HALF_UP,最終的結果應該是5,而不是4.另外,請記住,關於如何舍入的決定取決於最終結果是什麼(而不是小數部分就像你似乎已經假設的那樣)。

+0

我沒有得到這個引用文本。 – Tiny 2013-03-12 02:41:16

+0

@Tiny,這意味着如果你正在四捨五入的數字在半平模式下落在奇數和偶數之間的範圍的中心,那麼偶數將是舍入操作的結果。 – Perception 2013-03-12 02:47:40

+0

如果可以,請用一個簡單的例子來解釋。我發現這個基本的東西很難理解,並且我個人不能諮詢某人的幫助。 – Tiny 2013-03-12 03:06:55