我如何确定哪种方法更适合我的情况或更快速? 例如:-
public boolean isSquareNumber(){
double nd = Math.sqrt(num); // num is a class member variable.
if(nd == Math.floor(nd))
{
return true;
} else {
return false;
}
}
和此方法
public boolean isSquareNumber(){
double nd = Math.sqrt(num);
if(nd == (int)Math.sqrt(nd))
{
return true;
} else {
return false;
}
}
Math.floor()和Math.sqrt()。 在这种情况下,两者都完全相同,但是我如何确定哪个更快?
谢谢您的时间<3。
答案 0 :(得分:1)
测试double
值是否为整数的最快方法是:
double d = ...
if (d == ((long) d)) {
// It is an integer
}
请注意,sqrt(someValue)
可能(从理论上)产生一个double
值,该值与整数值没有区别,即使someValue
的真平方根不是整数。正如javadoc所述:
否则,结果是参数值的真实数学平方根的最接近值的双精度值最接近。
因此,即使实际平方根是非理性的,您也可能会遇到“最接近”的双精度值对应于整数的情况。
另一个争论点是Math.floor
是否正确。
一方面,缩小范围和Math.floor
不同:
Math.floor()
返回“小于或等于自变量且等于数学整数的最大(最接近正无穷大)浮点值” 。换句话说,它趋向于负无穷大。另一方面,如果我们测试的double
值是已知的非负 1 ,那么朝零和朝负无穷大舍入是同一回事。 / p>
1-Math.sqrt()
是这种情况吗?绝对不行,因为根据Javadoc,sqrt(-0.0)
被定义为返回-0.0
...。但是,出于舍入的目的,-0.0
应被视为+0.0
。