我怎样才能知道哪种方法更适合我的情况或更快? 例如:-
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。
测试double
值是否为整数的最快方法是:
double d = ...
if (d == ((long) d)) {
// It is an integer
}
请注意,sqrt(someValue)
(理论上(有可能产生与整数值无法区分的double
值,即使someValue
的真平方根不是整数。 正如javadoc所说:
否则,结果是最接近参数值的真实数学平方根的双精度值。
因此,您可以得到"最接近"的双精度值对应于整数的情况,即使实际的平方根是无理数的。
另一个争论点是Math.floor
是否真的正确。
一方面,缩小的演员阵容和Math.floor
不同:
- 缩小范围使用 IEE 754"舍入零"模式
Math.floor()
返回"小于或等于参数且等于数学整数的最大(最接近正无穷大(浮点值"。换句话说,它向负无穷大四舍五入。
另一方面,如果我们测试一个已知为非负1的double
值,那么四舍五入到零和负无穷大是一回事。
1 -Math.sqrt()
是这种情况吗? 严格不,因为sqrt(-0.0)
被定义为返回-0.0
...根据Javadoc。 但是,为了四舍五入的目的,-0.0
应被视为+0.0
。