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