2011-10-01 61 views
4

我確定這將是一個簡單的問題來回答,但我不能爲我的生活決定什麼必須做。所以這裏是:假設我們遵循使用BigDecimal進行財務計算的「最佳實踐」,那麼如何處理引發異常的東西(計算)呢?作爲例子:假設我必須拆分「用戶數量」來投資「n」個不同實體之間的債券。現在考慮用戶提交100美元投資分成3個債券的情況。等效代碼是這樣:用於財務計算和非終止計算的Bigdecimal

public static void main(String[] args) throws Exception { 
    BigDecimal bd1 = new BigDecimal("100.0"); 
    BigDecimal bd2 = new BigDecimal("3"); 
    System.out.println(bd1.divide(bd2)); 
} 

但我們都知道,由於分工不終止這個特殊的代碼片段將拋出一個ArithmeticException。在計算中使用無限精度數據類型時,如何在代碼中處理這些場景?

TIA,
佐助

更新:鑑於RoundingMode將有助於解決這個問題,接下來的問題是,爲什麼100.0/3不代替33.33 33.3? 33.33不會是一個「更準確」的答案,因爲你期望33美分而不是30美分?有什麼辦法可以調整它嗎?

+0

除法方法也有重載的實現,指定舍入模式請參閱此鏈接(http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html) –

+0

@sasuke,on你的更新:我測試過'bd1.divide(bd2,2,RoundingMode.HALF_EVEN)'([如下所示](http://stackoverflow.com/questions/7618812/bigdecimal-for-financial-calculations-and-non - 終止計算/ 7618840#7618840))和結果是33.33' – krock

+0

@ krock:再次感謝您的幫助;非常感激。 :) – sasuke

回答

7

答案是使用指定RoundingModeBigDecimal.divide()方法之一。

例如,下面使用舍入模式half even或銀行家舍入(但半了其他舍入模式的或者一個可以是根據要求的更合適)和將輪爲2位小數:

bd1.divide(bd2, 2, RoundingMode.HALF_EVEN); 
+0

感謝您的鏈接;現在的問題是,爲什麼'100.0/3'不是'33.33'而不是'33.3'? 33.33不會是一個「更準確」的答案嗎?有什麼辦法可以調整它嗎? – sasuke

+0

@sasuke,對於'33.33',將比例設置爲'2',如上例所示。這一切都取決於您想要舍入多少個小數位。如果您省略了比例參數,它將使用「bd1」的比例,即1(100.0有一個小數位)。 – krock

+0

謝謝,我完全忽略了那部分。我暫時所有的疑問都已被回答。 :-) – sasuke

2

divide有一個採用舍入模式的過載。你需要選擇一個。我相信「一半」是貨幣計算中最常用的一種。

+0

+1;但是這仍然不能解釋100/3 = 33.3比100/3 = 33.33更合理,因爲與30美分相比,33美分更接近答案。 – sasuke

1
bd1.divide(bd2, 5, BigDecimal.ROUND_FLOOR) 

這是一個例子,取決於你想要的舍入。

+0

我沒有downvote,但你發佈的引用是壞的,肯定不是來自可信的來源。 –

+0

那麼,它不完全是一個「參考」,更多的代碼示例。但好的,點了我刪除了鏈接 – Guillaume

+0

不知道誰推倒你,但感謝嘗試,+1。 :) – sasuke