1

我想检测一个像 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 这样的数字,这确实是一个完美的正方形。

4

2 回答 2

1

首先,您需要准确表示这些数字。可能您希望在某些小数位后截断。然后将数字乘以 的整数幂,100直到得到一个整数。检查整数是否为正方形。

于 2017-06-25T20:23:08.717 回答
1

我将解释您的断言,即 6.25 是一个完美的平方,因为它是有理数的平方(p/q 形式的数字,其中 p 和 q 都是整数)。

这与 Santosh Linkhas 解决方案不同,后者将完美平方视为整数平方乘以 10 的负幂。

关键的区别在于我认为1/9 = 0.111111...它是一个完美的正方形,因为它是1/3 = 0.33333...平方的。

这个问题的有趣部分是所有双精度数都是有理数,但并非所有有理数都可以表示为双精度数。

我的建议如下:找出值的平方根是否有一个很好的有理逼近 -将小数简化为分数的算法是一个非常好的起点。

于 2017-06-26T02:57:45.967 回答