2013-04-07 65 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?