1、对数运算
对数运算 复习:
java 中没有求 对数的方法,通过 Math.log(x) / Math.log(y)
方式来求对数。
/**
* 求指数、对数
* x 真数
* y 底数
*/
public static double pow(double x ,double y) {
double cc=Math.log(x)/Math.log(y);
return cc;
}
2、精度失真,无法避免,java不适合做精度计算
import java.math.BigDecimal;
public class Main2 {
public static void main(String[] args) {
int x = 1000000;
int y = 10;
System.out.println(pow(x, y));
BigDecimal a = new BigDecimal(1000000 + "");
BigDecimal b = new BigDecimal(10 + "");
System.out.println(pow2(a, b));
}
/**
* 求指数、对数
*
* @param x 真数
* @param y 底数
* @return
*/
public static double pow(double x, double y) {
double cc = Math.log(x) / Math.log(y);
return cc;
}
public static double pow2(BigDecimal x, BigDecimal y) {
double cc = Math.log(x.doubleValue()) / Math.log(y.doubleValue());
return cc;
}
}
测试,真数是1000000 ,底数是10,
运行结果是
5.999999999999999
5.999999999999999
精度失真!!!
由于Math.log() 和 其Java底层的 StrictMath.log(a)
方法的入参、返回参数都是double类型的,导致Math.log()的精度失真问题无法避免。
Java底层代码使用double,可见底层开始都不支持精度计算,所以Java不善长做各类的计算工作。