使用无理数。 Return 1/22140 。简化?

Using irrational numbers. Return 1/22140 . Simplify?

这不可能吗?是否应该简化分数以避免 'non terminating decimal expansion' public class 方法 {

BigDecimal a = new BigDecimal("1");
BigDecimal b = new BigDecimal ("22140");
BigDecimal c;


void cal () {
    
    System.out.println(c=a.divide(b));
    
}

我假设您是在问是否可以将 1 / 22140 精确表示为 BigDecimal。答案是否定的。BigDecimal class 不能表示具有非终止十进制扩展的值,并且没有允许它的等式的简化。

问:为什么?

A:基本上,数学。 1 / 22140 不能表示为 m * 10s 其中 m 和 s 是有限整数。


有两种实用的替代方法:

  1. 您可以在进行除法时使用 MathContext 参数来指定如何舍入数字以及保留多少精度;例如

    c = a.divide(b, new MathContext(100, RoundingMode.HALF_UP));
    

    这将以 100 位小数精度计算结果,四舍五入(以常规方式)到最接近的可表示值。

    请注意,这种方法会给您 不准确 结果;例如(1 / 3) * 3 不会正好是 1,无论您在 MathContext.

    中将精度设置为什么
  2. 您可以找到并使用第 3 方 RationalFraction class,或者自己编写。

    请注意 Java SE 不提供这样的 class。