确定Double的完美Java代码是否是完美的正方形?

时间:2014-03-09 08:31:03

标签: java numbers

我想确定一个数字(双数)是否是一个完美的正方形。我使用了下面的代码,但很多输入失败了。

private static boolean isSquare(double i) {
        double s = Math.sqrt(i);
        return ((s*s) == i);
    }

s导致科学形式时,代码失败。例如,当s2.719601835756618E9

3 个答案:

答案 0 :(得分:2)

您的代码不会尝试测试数字的平方根是否为整数。任何非负实数都是其他实数的平方;你的代码的结果完全取决于浮点舍入行为。

测试平方根是否为整数:

if (Double.isInfinite(i)) {
    return false;
}
sqrt = Math.sqrt(i);
return sqrt == Math.floor(sqrt) && sqrt*sqrt == i;

sqrt*sqrt == i检查应该记录一些特别接近正方形的数字具有平方根的情况,其最接近的double近似是整数。我没有对此进行测试,也没有对其正确性做出任何保证;如果你希望你的软件健壮,不要只是将代码复制出答案。

更新:找到一个失败的边缘案例。如果整数double具有足够长的奇数因子,使得该正方形不可表示,则将该正方形的最接近的双近似值馈送到该代码将导致误报。我现在能想到的最好的解决方法是直接检查平方根的有效位数,以确定表示平方所需的精度位数。谁知道我错过了什么呢?

答案 1 :(得分:0)

静态布尔值checkPerfectSquare(double x)
{

// finding the square root of given number 
double sq = Math.sqrt(x); 

/* Math.floor() returns closest integer value, for
 * example Math.floor of 984.1 is 984, so if the value
 * of sq is non integer than the below expression would
 * be non-zero.
 */
return ((sq - Math.floor(sq)) == 0); 
} 

答案 2 :(得分:-1)

我知道问题已经过时了,但无论如何我都会发布我的解决方案:

return Math.sqrt(i) % 1d == 0;

只需检查sqrt是否有小数。