测试双精度是否为 int 以及如何决定的最快方法(方法)是什么?



我怎样才能知道哪种方法更适合我的情况或更快? 例如:-

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()返回"小于或等于参数且等于数学整数的最大(最接近正无穷大(浮点值"。换句话说,它向负无穷大四舍五入。

另一方面,如果我们测试一个已知为非负1double值,那么四舍五入到零和负无穷大是一回事。


1 -Math.sqrt()是这种情况吗? 严格不,因为sqrt(-0.0)被定义为返回-0.0...根据Javadoc。 但是,为了四舍五入的目的,-0.0应被视为+0.0

最新更新