使用无理数。 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 是有限整数。
有两种实用的替代方法:
您可以在进行除法时使用 MathContext
参数来指定如何舍入数字以及保留多少精度;例如
c = a.divide(b, new MathContext(100, RoundingMode.HALF_UP));
这将以 100 位小数精度计算结果,四舍五入(以常规方式)到最接近的可表示值。
请注意,这种方法会给您 不准确 结果;例如(1 / 3) * 3 不会正好是 1,无论您在 MathContext
.
中将精度设置为什么
您可以找到并使用第 3 方 Rational
或 Fraction
class,或者自己编写。
请注意 Java SE 不提供这样的 class。
这不可能吗?是否应该简化分数以避免 '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 是有限整数。
有两种实用的替代方法:
您可以在进行除法时使用
MathContext
参数来指定如何舍入数字以及保留多少精度;例如c = a.divide(b, new MathContext(100, RoundingMode.HALF_UP));
这将以 100 位小数精度计算结果,四舍五入(以常规方式)到最接近的可表示值。
请注意,这种方法会给您 不准确 结果;例如(1 / 3) * 3 不会正好是 1,无论您在
中将精度设置为什么MathContext
.您可以找到并使用第 3 方
Rational
或Fraction
class,或者自己编写。请注意 Java SE 不提供这样的 class。