我试图在java中使用得到立方根Math.pow(n, 1.0/3)
但因为它除以双精度数,所以它不会返回确切的答案。例如,对于 125,结果为 4.9999999999。有解决方法吗?我知道有一个立方根函数,但我想解决这个问题,以便我可以计算更高的根。
我不想四舍五入,因为我想通过执行以下操作来知道数字是否具有整数根:Math.pow(n, 1.0 / 3) % ((int) Math.pow(n, 1.0 / 3))
.
由于不可能进行任意精度的微积分double
,你有三个选择:
- 定义一个精度,您可以根据该精度决定是否
double
value 是否为整数。
- 测试是否四舍五入的值
double
你得到的是一个正确的结果。
- 在 a 上进行微积分BigDecimal http://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html对象,支持任意精度的双精度值。
Option 1
private static boolean isNthRoot(int value, int n, double precision) {
double a = Math.pow(value, 1.0 / n);
return Math.abs(a - Math.round(a)) < precision; // if a and round(a) are "close enough" then we're good
}
这种方法的问题是如何定义“足够接近”。这是一个主观问题,取决于您的要求。
Option 2
private static boolean isNthRoot(int value, int n) {
double a = Math.pow(value, 1.0 / n);
return Math.pow(Math.round(a), n) == value;
}
这种方法的优点是不需要定义精度。然而,我们还需要执行另一项操作pow
操作,因此这会影响性能。
Option 3
没有内置方法来计算 BigDecimal 的双倍幂。这个问题 https://stackoverflow.com/q/3579779/1743880会让您深入了解如何做到这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)