2017-02-28 77 views
1

我想用scale = 3和HALF_UP舍入模式來舍入0.14049,並希望看到舍入值= 0.141,但取而代之的是0.140。BigDecimal HALF_UP舍入問題

根據我的理解,最後一位十進制數字9應該四捨五入,當使用比例尺3時應該輪到0到1,我應該看到0.141。

是BigDecimal setScale方法中的錯誤還是我對舍入的期望是錯誤的。我怎樣才能得到類似於0.141而不是0.140的四捨五入值?

BigDecimal bd=new BigDecimal("0.14049"); 
BigDecimal normalizedField = field.setScale(3, RoundingMode.HALF_UP); 
System.out.println(normalizedField); 
// Output = 0.140 
+4

對於HALF_UP生效,您的值至少需要0.1405 – Reimeus

+5

1.14049比1.141更接近1.140。你爲什麼期望四捨五入把你帶到更遠的價值?你的期望是錯誤的,而不是BigDecimal。 –

+0

感謝這個例子,我被代碼庫中的一些現有實現誤導了。 –

回答

8

按我理解最後一個小數位9應該向上舍入4〜5,並使用比例3時應在迴轉圓向上0到1和I應該看到0.141。

這種理解是不正確的。舍入不是一個迭代過程。只考慮比例尺位置後的第一個數字,而不考慮整個數字鏈。在你的情況下,這個數字是4,所以它被轉換爲零。

+0

感謝澄清,我假設它從最低有效位數開始並開始舍入,並且結果朝向更重要的小數位結轉。 –

0

根據您的業務領域,「4999998」案件將始終發生在同一位置。我有類似的情況,規模是2.所以我補充和額外的步驟四捨五入。在你的情況下:

BigDecimal bd=new BigDecimal("0.14049"); 
BigDecimal normalizedField = bd.setScale(4, RoundingMode.HALF_UP).setScale(3, RoundingMode.HALF_UP); 
System.out.println(normalizedField);