Math数学计算
java.lang.Math类是在整个Java之中提供的数学计算的功能类,利用这个程序功能类可以非常方便的执行一些基础的数学计算:对数、三角函数、开方...
这个类是在JDK1.0提供给用户使用的,且不提供构造方法。
类构造方法私有化的原因有两点:
- 控制当前类中的实例化对象个数,所谓的单例设计模式、多例设计模式;
- 类中没有提供普通的成员属性,并且类中的成员都是static申明,方法也是采用static声明。
在Math类的成员里面提供有两个公共的成员常量:E、PI
除了给出的常量之外,Math类中的方法几乎都是static定义的方法。
范例:使用Math实现数学公式的调用
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("[绝对值]:" + Math.abs(-10.3));
System.out.println("[最大值]:" + Math.max(10,30));
System.out.println("[最小值]:" + Math.min(10,30));
System.out.println("[正弦值]:" + Math.sin(-3.56));
System.out.println("[对数值]:" + Math.log(20));
}
}
执行结果:
[绝对值]:10.3
[最大值]:30
[最小值]:10
[正弦值]:0.4063057021444168
[对数值]:2.995732273553991
以上的操作是为数学中最为常见的计算公式。
但是对于Math类类说里面有一个比较头疼的方法,这个方法就是进行四舍五入的处理操作,此方法定义如下:
public static long round(double a)
但是这个round()方法的实现计算结果可能和传统的认知是有差别的(需要特别注意,面试中可能问到)
范例:观察四舍五入
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println("[四舍五入]:" + Math.round(15.1));
System.out.println("[四舍五入]:" + Math.round(15.51));
System.out.println("[四舍五入]:" + Math.round(-15.1));
System.out.println("[四舍五入]:" + Math.round(-15.51));
}
}
输出:
[四舍五入]:15
[四舍五入]:16
[四舍五入]:-15
[四舍五入]:-16
在使用Math类实现四舍五入处理的过程之中,如果要操作的数值为负数,那么这个时候如果小数点的内容超过了“0.5”,则会自动进行进位处理。
虽然在Math类中提供有四舍五入的出来方法,可是这个四舍五入的处理方法会将全部的小数位进行整体的进位处理,这样的处理模式一定是存在问题的。
例如:有一家公司每年的收入都是以亿为单位的,今年的收入达到了3.467212亿,如果说使用的Math.round()方法实现了四舍五入,最终就表示只有3亿的收入,那么请问其余的4000多万那里去了?如果想要解决这样的问题就需要开发者自己去定义一个新的四舍五入的处理方法。
范例:实现自定义四舍五入操作
/**
* 该类是自定义的数学工具类
*/
class MathUtil {
private MathUtil() {
} //不存在成员属性,构造方法私有化
/**
* 进行准确位数的四舍五入操作
*
* @param num 表示要进行处理的数字
* @param scale 表示要保留的小数位数
* @return 处理后的结果
*/
public static double round(double num, double scale) {
return Math.round(num * Math.pow(10.0, scale)) / Math.pow(10, scale);
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
System.out.println(MathUtil.round(15.254521,3));
}
}
执行结果:
15.255
在本工具类里面最终还是依靠Math类实现了四舍五入的操作,在Math类中由于round()方法不保留小数,所以让数据进行一个整倍的扩充,随后在计算完成之后再除以相应的倍数,就得到了正确的四舍五入结果。
这种四舍五入的实现思想不仅仅是用于Java技术上,实际上各个语言都有同样的操作实现,理解思路最为重要。