首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用幂方法计算Java中的n次方根

用幂方法计算Java中的n次方根
EN

Stack Overflow用户
提问于 2015-09-14 02:29:48
回答 9查看 29.9K关注 0票数 23

我试图用Math.pow(n, 1.0/3)在java中得到一个立方根,但是因为它可以除以双精度,所以不能返回确切的答案。例如,使用125时,结果为4.9999999999。有解决这个问题的办法吗?我知道有一个立方根函数,但我想解决这个问题,这样我就可以计算更高的根。

我不想四舍五入,因为我想知道一个数字是否有整数根,方法如下:Math.pow(n, 1.0 / 3) % ((int) Math.pow(n, 1.0 / 3))

EN

回答 9

Stack Overflow用户

发布于 2015-09-14 02:57:43

由于double不可能实现任意精度的微积分,因此您有三种选择:

  1. 定义用于确定double值是否为整数的精度。
  2. 测试double的舍入值是否为正确结果。
  3. 对支持任意精度双精度值的BigDecimal对象执行微积分。<代码>H210<代码>G211

选项1

代码语言:javascript
复制
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
}

这种方法的问题是如何定义“足够接近”。这是一个主观问题,它取决于您的需求。

选项2

代码语言:javascript
复制
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操作,因此这将影响性能。

选项3

没有内置的方法来计算BigDecimal的两倍幂。This question将为您提供如何做到这一点的洞察力。

票数 10
EN

Stack Overflow用户

发布于 2015-09-14 02:33:18

Math.round函数将舍入到最接近的长整型值,该值可以存储为双精度型。您可以比较两个结果,以查看该数字是否具有整数立方根。

代码语言:javascript
复制
double dres = Math.pow(125, 1.0 / 3.0);
double ires = Math.round(dres);
double diff = Math.abs(dres - ires);
if (diff < Math.ulp(10.0)) {
    // has cubic root
}

如果这还不够,您可以尝试实现this算法,如果结果似乎不是整数,则提前停止。

票数 6
EN

Stack Overflow用户

发布于 2015-09-14 02:57:51

我会去实现我自己的函数来做这件事,可能是基于this方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32553108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档