检测一个double是否是Java中的完美正方形
问题描述:
我想检测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这样就不会换号工作,这确实是一个完美的正方形。
答
首先,您需要确切地表示这些数字。可能你会想在某些小数点后截断。然后乘以100
的整数次幂,直到得到一个整数。检查它的整数是否正方形。
答
我要解释你的说法,即6.25是一个完美的正方形,因为它是一个有理数(表格P的数/ q其中p和q均为整数)的平方。
这不同于桑托什Linkhas解决方案,其中 一个完美的正方形是采取为整数倍的平方10.
的关键区别的负电源是该我会考虑1/9 = 0.111111...
是因为一个完全平方它是1/3 = 0.33333...
平方。
这个问题有趣的部分是所有的双打都是有理的,但并非所有的理性都可以表达为双打。
我建议如下:找出是否有一个很好的合理的近似值的平方根 - Algorithm for simplifying decimal to fractions是一个非常好的起点。
什么是以小数为单位的“完美平方”?一个有限小数的平方?在二进制?请注意,在浮点数中,'0.1 * 0.1'导致'0.010000000000000002'为'0.1',不能准确表示。 – LutzL