我有
BigDecimal a = new BigDecimal(7);
BigDecimal b = new BigDecimal(13);
BigDecimal c = new BigDecimal(26);
System.out.print((a.divide(b)).multiply(c));
此代码生成异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
这意味着我需要设置RoundingMode
。
但我需要在不损失精确度的情况下获得结果。
我怎样才能实现它?
答案 0 :(得分:1)
看到7/13
继续无限,你所要求的是不可能的。你唯一可能的选择就是在划分时有一个很大的精度。
答案 1 :(得分:0)
将7除以13将给出长且非终止小数( 0.538461 53846 .....)。所以你需要为它设置精度限制。试试这个:
a.divide(b, x, RoundingMode.HALF_UP).multiply(c)
其中x是您要设置的精度限制。
Javadocs说:
提供MathContext对象时,精度设置为0 (例如,MathContext.UNLIMITED),算术运算是精确的, 不带MathContext对象的算术方法也是如此。 (这个 是5之前版本中唯一支持的行为。)
作为计算确切结果的推论,舍入模式 设置精度设置为0的MathContext对象不是 使用,因而无关紧要。在除法的情况下,确切的商 可以有一个无限长的十进制扩展;例如,1 除以3。
答案 2 :(得分:0)
7/3的小数位数将无穷大。你必须围绕它AFAIK。您可以保留6个小数位,因为前6个位置无限重复
答案 3 :(得分:0)
Apache commons库可以吗