检测 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 是一个非常好的起点。