仅当小数重复时才设置BigDecimal精度

use*_*184 3 java precision bigdecimal

我知道我可以使用BigDecimal.divide()方法来设置固定的精度:

BigDecimal a1 = new BigDecimal(1);
BigDecimal a2 = new BigDecimal(3);
BigDecimal division = a1.divide(a2,5,1); //equals 0.33333
Run Code Online (Sandbox Code Playgroud)

但如果除法结果是准确的:

BigDecimal a1 = new BigDecimal(1);
BigDecimal a2 = new BigDecimal(4);
BigDecimal division = a1.divide(a2,5,1); //equals 0.25000
Run Code Online (Sandbox Code Playgroud)

如何设置除法结果,如果除法以精确结果结束,它将只输出0.25而不是0.25000?

我还试图通过这样做来指定精度:

BigDecimal division = a1.divide(a2);
Run Code Online (Sandbox Code Playgroud)

它在执行0.25时成功地给出了结果1/4,但是当它像分区一样1/3或者2/3它导致运行时ArithmeticException.

a1a2从用户输入实例化.

有什么方法可以解决这个问题吗?

dim*_*414 6

你得到的ArithmeticException,如描述的BigDecimal.divide(BigDecimal)- " 如果准确的商值没有十进制扩展 "因为正确表示结果1/3将采取无限怀念.通过使用BigDecimal.divide(BigDecimal,int,RoundingMode)您明确设置您可以容忍的精度,意味着任何除法可以在内存中近似.

为了保持一致性,此版本的除法总是将比例设置为您指定的比例,即使该值可以用较低的精度准确表示.如果没有,那么您很难推断使用该结果的未来计算的准确程度.

减少精确使用.stripTrailingZeros(); 这有效地将规模降低到最小.在过程的最后阶段(即在打印之前)这样做,以保持我上面提到的一致性.

.toPlainString()如果你想要很好地显示这些值,你可能也想要,因为.stripTrailingZeros()它本身会显示1001E+2.