2014-12-13 32 views
0

我正在嘗試使用BigDecimal來計算GST稅率。BigDecimal分部

稅款計算應該是1/11 *項目價格。

所以我想我應該使用BigDecimal來給出最準確的表示。但由於某種原因,費率總是被計算爲零。

這是我已經試過:

BigDecimal TAX_RATE = new BigDecimal("1") 
    .divide(new BigDecimal("11"), BigDecimal.ROUND_HALF_UP); 
BigDecimal bd = new BigDecimal("10").multiply(TAX_RATE); 
// gives 0 

有誰知道爲什麼嗎?

+0

非常小的nit,但要記住 - BigDecimal.ONE和BigDecimal.TEN以常量存在。您還可以找到scaleByPowerOfTen([javadoc](http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html#scaleByPowerOfTen(int))),以便有用而不是乘以十。雖然,那與你所遇到的問題無關。 – 2014-12-13 02:26:42

+0

如果您將物品價格除以11而不是乘以代表1/11的值,您將得到更準確的結果。這是因爲'BigDecimal'不能完全代表1/11(.090909090 ...),因爲您的計算機沒有足夠的內存來保存整個重複小數。 :)最終,如果物品價格足夠大,你會得到一個舍入誤差。 – ajb 2014-12-13 02:29:35

+0

好的,謝謝,是的,我會修改代碼將價格除以11,這個好主意。邁克爾 - 「10」只是隨意的,與計算無關,只是一個示例。乾杯。 – 2015-01-07 04:14:52

回答

1

嘗試

BigDecimal TAX_RATE = new BigDecimal("1").divide(new BigDecimal("11"), 500, BigDecimal.ROUND_HALF_UP); 

第二個參數指定的精度。默認情況下它是零,所以你最終將所有內容舍入爲一個整數。

+0

謝謝你的工作。 – 2014-12-13 03:04:30