2017-06-25 79 views
1

我想检测double是否是一个完美正方形。检测一个double是否是Java中的完美正方形

为了检测完全平方为的平方根是一个整数这些数字,我会做类似

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 * 0.1'导致'0.010000000000000002'为'0.1',不能准确表示。 – LutzL

回答

1

首先,您需要确切地表示这些数字。可能你会想在某些小数点后截断。然后乘以100的整数次幂,直到得到一个整数。检查它的整数是否正方形。

1

我要解释你的说法,即6.25是一个完美的正方形,因为它是一个有理数(表格P的数/ q其中p和q均为整数)的平方。

这不同于桑托什Linkhas解决方案,其中 一个完美的正方形是采取为整数倍的平方10.

的关键区别的负电源是该我会考虑1/9 = 0.111111...是因为一个完全平方它是1/3 = 0.33333...平方。

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

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

相关问题