Java Math.pow(x,y)的使用坑,项目中为了比较一些业务数据,使用到了这个函数:如下:
public void setBaseLineData(double baseLineData) {
if (Math.abs(this.baseLineData - baseLineData) > Math.pow(0.1, getBaseLineLabelFraction())) {
System.out.println("有没有进来这里=============重新设置base的值");
this.baseLineData = baseLineData;
refreshState();
}
}
这里面有一个问题就是如果y的参数为0的话,Math(0.1,0)的数值就是1,也就是任何数的0次方都为1,哎,好久没学数学了都.记录一下:
因为Math.pow(x,y)这个函数是求x的y次方,x,y的值都是浮点类型的,而你现在要求的是pow(64,1/3),那么也就是64的1/3次方,如果我们口头上来算的话,可以看成64的3次方根,但是计算机不会这样算,他会先求出1/3的值,1/3中1和3均为int类型,所以值为0,然后y这个值是浮点类型,所以自动转换为0.0,任何数字的0次幂都为1,所有这个地方求出来的值为1,而不是4,有时候我们不能以数学的方式来判断计算机的算法,
还有如果求一个数值的绝对值也可以使用Math.abs()之前一直还想自己进行判断,原来早有提供.写了一个测试程序,展示如下:
public class Ceshi {
public static void main(String[] args) {
double powceshi = Math.pow(0.1, 0);
double powdouble1 = Math.pow(0.1, 0.1);
double powdouble2 = Math.pow(0.1, 0.01);
double powdouble3 = Math.pow(0.1, 0.001);
double powdouble4 = Math.pow(0.1, 0.0001);
double powdouble5 = Math.pow(0.1, 0.00001);
System.out.println("当为0的情况下的Math.pow(0.1, 0)" + powceshi);
System.out.println("输出的数值为Math.pow(0.1, 0.1):" + powdouble1);
System.out.println("输出的数值为Math.pow(0.1, 0.01):" + powdouble2);
System.out.println("输出的数值为Math.pow(0.1, 0.001):" + powdouble3);
System.out.println("输出的数值为Math.pow(0.1, 0.0001):" + powdouble4);
System.out.println("输出的数值为Math.pow(0.1, 0.00001):" + powdouble5);
}
}
结果如下:
当为0的情况下的Math.pow(0.1, 0)1.0
输出的数值为Math.pow(0.1, 0.1):0.7943282347242815
输出的数值为Math.pow(0.1, 0.01):0.9772372209558107
输出的数值为Math.pow(0.1, 0.001):0.9977000638225533
输出的数值为Math.pow(0.1, 0.0001):0.9997697679981565
输出的数值为Math.pow(0.1, 0.00001):0.9999769744141629