我想确定一个数字(双数)是否是一个完美的正方形。我使用了下面的代码,但很多输入失败了。
private static boolean isSquare(double i) {
double s = Math.sqrt(i);
return ((s*s) == i);
}
当s
导致科学形式时,代码失败。例如,当s
为2.719601835756618E9
答案 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
是否有小数。