检测双精度是否是Java中的完美正方形

时间:2017-06-25 18:19:19

标签: math double pow sqrt math.sqrt

我想检测一个双倍,如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这样的数字来说这不适用,这确实是一个完美的正方形。

2 个答案:

答案 0 :(得分:1)

首先,您需要准确表示此类数字。可能你会想要在某些小数位后截断。然后将数字乘以https.createServer的整数幂,直到得到一个整数。检查整数是否为正方形。

答案 1 :(得分:1)

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

这与Santosh Linkhas解决方案不同 一个完美的正方形是一个整数乘以10的负幂的平方。

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

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

我建议如下:找出是否对值的平方根有一个很好的有理近似 - Algorithm for simplifying decimal to fractions是一个非常好的起点。