java-测试double是否为int的最快方法(方法)是什么,如何确定?

时间:2018-09-22 09:15:18

标签: java performance

我如何确定哪种方法更适合我的情况或更快速? 例如:-

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。

1 个答案:

答案 0 :(得分:1)

测试double值是否为整数的最快方法是:

double d = ...
if (d == ((long) d)) {
   // It is an integer
}

请注意,sqrt(someValue)可能(从理论上)产生一个double值,该值与整数值没有区别,即使someValue的真平方根不是整数。正如javadoc所述:

  

否则,结果是参数值的真实数学平方根的最接近值的双精度值最接近

因此,即使实际平方根是非理性的,您也可能会遇到“最接近”的双精度值对应于整数的情况。


另一个争论点是Math.floor是否正确。

一方面,缩小范围和Math.floor不同:

  • 缩小使用IEE 754“四舍五入”模式
  • Math.floor()返回“小于或等于自变量且等于数学整数的最大(最接近正无穷大)浮点值” 。换句话说,它趋向于负无穷大。

另一方面,如果我们测试的double值是已知的非负 1 ,那么朝零和朝负无穷大舍入是同一回事。 / p>


1-Math.sqrt()是这种情况吗?绝对不行,因为根据Javadoc,sqrt(-0.0)被定义为返回-0.0...。但是,出于舍入的目的,-0.0应被视为+0.0