这不可能吗?分数应该简化以避免“非终止小数展开”公共类方法吗{
BigDecimal a = new BigDecimal("1"); BigDecimal b = new BigDecimal ("22140"); BigDecimal c; void cal () { System.out.println(c=a.divide(b)); }
kb5ga3dv1#
我想你是在问是否有可能把1/22140精确地表示为 BigDecimal . 答案是否定的 BigDecimal 类不能用非终止的十进制展开来表示值,并且不允许对等式进行简化。问:为什么?a:基本上是数学。1/22140不能表示为m*10s,其中m和s是有限整数。有两种可行的替代方法:你可以使用 MathContext 参数指定如何对数字进行舍入以及保持多少精度;例如
BigDecimal
MathContext
c = a.divide(b, new MathContext(100, RoundingMode.HALF_UP));
这将计算精度为100位小数的结果,四舍五入(以传统方式)到最接近的可表示值。请注意,这种方法会给出不精确的结果;e、 g.(1/3)*3不完全是1,无论您在 MathContext .您可以找到并使用第三方 Rational 或者 Fraction 上课,或者自己写。注意,javase没有提供这样的类。
Rational
Fraction
1条答案
按热度按时间kb5ga3dv1#
我想你是在问是否有可能把1/22140精确地表示为
BigDecimal
. 答案是否定的BigDecimal
类不能用非终止的十进制展开来表示值,并且不允许对等式进行简化。问:为什么?
a:基本上是数学。1/22140不能表示为m*10s,其中m和s是有限整数。
有两种可行的替代方法:
你可以使用
MathContext
参数指定如何对数字进行舍入以及保持多少精度;例如这将计算精度为100位小数的结果,四舍五入(以传统方式)到最接近的可表示值。
请注意,这种方法会给出不精确的结果;e、 g.(1/3)*3不完全是1,无论您在
MathContext
.您可以找到并使用第三方
Rational
或者Fraction
上课,或者自己写。注意,javase没有提供这样的类。