Math 检测double在Java中是否是完美的正方形

Math 检测double在Java中是否是完美的正方形,math,double,pow,sqrt,math.sqrt,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(sq

我想检测一个双精度,比如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…< /代码>平方。

这个问题有趣的部分是,所有的对偶都是有理数,但并非所有的有理数都可以表示为对偶

我的建议是:找出值的平方根是否有一个很好的有理近似,这是一个很好的起点

什么是十进位小数的“完美平方”?有限小数的平方?二进制的?请注意,在浮点数中,
0.1*0.1
导致
0.010000000002
,因为
0.1
无法准确表示。