2013-04-07 60 views
0

因此,BigDecimal似乎無法存儲無限繼續1/3的數字。當我嘗試,我得到以下內容:BigDecimal舍入

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 

所以我決定使用RoundingMode。當我做(1/3)*3時,我希望它回到1,而不是像0.9或0.99或0.999或任何類似的形式。但是,如果我做的(1/3)* 2,我不希望它四捨五入到1

回答

0

看起來像你需要四捨五入爲1位小數,試試這個:

BigDecimal base = new BigDecimal("1.0"); 
BigDecimal result = base.divide(new BigDecimal("3"), 1, RoundingMode.HALF_UP); 

並且還讀取文檔here

+0

這就是我所做的。我想弄清楚如果我想把結果乘以3 – dalawh 2013-04-07 16:35:33

+1

不可能的話,如何讓它回到一個。當你進行數學計算時,你需要決定是否需要精確結果(不捨入)或舍入結果(並且失去精度)。 – 1ac0 2013-04-07 16:48:08

0

如果您將您的號碼四捨五入,您將丟失信息。使用BigDecimal,除非您再次舍入最終結果,否則您將永遠得不到1(1/3)* 3。

+0

是否有替代BigDecimal可以讓我在我做(1/3)* 3時得到1,當我做(1/3)* 2時得到0.6667? – dalawh 2013-04-07 16:38:31

+0

最好的選擇是我想的Medo42的答案。 – WilQu 2013-04-07 17:10:42

1

如果你的除數總是3,你可以用3的整數進行數學計算,以得到確切的結果。用2表示2/3,用1表示1/3。如果把它們將讓你3,代表3/3 = 1

如果你需要不同的除數,但仍只可通過分數來表示數字的工作,你可能想看看這個問題:Best way to represent a fraction in Java?

如果您需要準確地表示(並計算)無理數(例如Pi或sqrt(2)),那麼您可能運氣不佳。看到這裏:Irrational number representation in any programming language?