检测 double 是否是 Java 中的完美正方形
Detect if a double is a perfect square in Java
我想检测一个双精度数,例如 6.25 是否是一个完美的正方形。
要检测那些平方根为整数的数字的完美平方,我会做类似的事情
public boolean isPerfectDouble( double i )
{
if (Double.isInfinite(i)) {
return false;
}
double sqrt = Math.sqrt(i);
return sqrt == Math.floor(sqrt) && sqrt*sqrt == i;
}
但是,这不适用于 6.25 这样的数字,它确实是一个完美的正方形。
首先,您需要准确表示这些数字。可能您想在某些小数位后截断。然后将数字乘以 100
的整数次方,直到得到整数。检查整数是否为正方形。
我将解释您关于 6.25 是完全平方数的断言,因为它是有理数的平方(p/q 形式的数字,其中 p 和 q 都是整数)。
这不同于 Santosh Linkhas 的解决方案,其中
一个完美的平方是一个整数乘以 10 的负幂的平方。
主要区别在于我认为 1/9 = 0.111111...
是一个完美的正方形,因为它是 1/3 = 0.33333...
的平方。
这个问题的有趣部分是所有双打都是有理数,但并非所有有理数都可以表示为双打。
我的建议如下:找出值的平方根是否有一个很好的有理近似值 - Algorithm for simplifying decimal to fractions 是一个非常好的起点。
我想检测一个双精度数,例如 6.25 是否是一个完美的正方形。
要检测那些平方根为整数的数字的完美平方,我会做类似的事情
public boolean isPerfectDouble( double i )
{
if (Double.isInfinite(i)) {
return false;
}
double sqrt = Math.sqrt(i);
return sqrt == Math.floor(sqrt) && sqrt*sqrt == i;
}
但是,这不适用于 6.25 这样的数字,它确实是一个完美的正方形。
首先,您需要准确表示这些数字。可能您想在某些小数位后截断。然后将数字乘以 100
的整数次方,直到得到整数。检查整数是否为正方形。
我将解释您关于 6.25 是完全平方数的断言,因为它是有理数的平方(p/q 形式的数字,其中 p 和 q 都是整数)。
这不同于 Santosh Linkhas 的解决方案,其中 一个完美的平方是一个整数乘以 10 的负幂的平方。
主要区别在于我认为 1/9 = 0.111111...
是一个完美的正方形,因为它是 1/3 = 0.33333...
的平方。
这个问题的有趣部分是所有双打都是有理数,但并非所有有理数都可以表示为双打。
我的建议如下:找出值的平方根是否有一个很好的有理近似值 - Algorithm for simplifying decimal to fractions 是一个非常好的起点。