1、Math数学计算类
Math类的主要功能是进行数学计算的操作类,提供有基础的计算公式操作,且这个类的构造方法被私有化,且该类中的所有方法都是static型的方法,即:这些方法都可以通过类名称直接调用。
范例:一些数学方法使用
package cn.demos;
public class JavaAPIDemo {
public static void main(String[] args) throws Exception {
// 取正
System.out.println(Math.abs(-10.1));// 10.1
// 最大值
System.out.println(Math.max(12, 14));// 14
// 对数
System.out.println(Math.log(5));// 1.6094379124341003
System.out.println(Math.round(15.1));// 15
System.out.println(Math.round(15.8));// 16
}
}
详细操作方法可以参考文档:https://docs.oracle.com/javase/9/docs/api/java/lang/Math.html
注意:在Math类中虽然提供有四舍五入的方法,但是这个方法在处理的时候是直接将小数点后的所有位进行进位处理。所以,此时提供了一个可以实现指定位数的保留。
范例:自定义的四舍五入功能
代码 | 结果 |
package cn.demos; class MathUtil { private MathUtil() { } /** return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale); } } public class JavaAPIDemo { public static void main(String[] args) throws Exception { System.out.println(MathUtil.round(16.6765554, 2)); } } | 16.68 |
注意:Math类里面提供的基本上都是基础的数学公式,在有需求时需要自己重新整合算法。
2、Random随机数生成类
Random类是产生随机数的,这个类主要是依靠内部提供的方法来完成的:
方法 | 定义 | 代码 | 描述 |
产生一个不大于边界的随机正整数 | | package cn.demos; import java.util.Random; public class JavaAPIDemo { public static void main(String[] args) throws Exception { Random rand = new Random(); } } | 45、31、81、41、6、33、0、23、38、23、 |
范例:随机生成彩票号——36选7
分析:
1)彩票数字不能有0存在;
2)不能够重复。
代码 | 结果 |
package cn.demos; import java.util.Random; public class JavaAPIDemo { public static void main(String[] args) throws Exception { int data[] = new int[7];// 开辟7个大小的空间 } } /** } } | 9、14、16、19、26、31、34、 |
3、大数字处理类
在进行数据计算的过程里面还有一个大数字操作类,可以实现海量数字的计算,但是提供的方法也只是基础计算。
大数字指数字很大,大到已经超过了double的数据范围,则没有任何一种数据类型可以保存下此类的内容,所以最早时只能通过String进行保存,而String类保存的数字要进行计算的话,会将每个位的数字提取出来然后对应位进行计算,这样的操作方法比较繁琐且难度大,所以为了解决这种问题,提供了两个大数字的操作类:BigInteger、BigDecimal。
结构 | 构造方法 | |
BigInteger类 | public class BigInteger extends Number implements Comparable<BigInteger> | public BigInteger(String val) |
BigDecimal类 | public class BigDecimal extends Number implements Comparable<BigDecimal> | public BigDecimal(String val) |
范例:观察BigInteger类的四则运算
代码 | 结果 |
package cn.demos; import java.math.BigInteger; public class JavaAPIDemo { public static void main(String[] args) throws Exception { BigInteger bigA = new BigInteger("273626272626526352787655444335336327353632363627"); } } | 【加法操作】:273626272626526352787655444362698954616284998903 【减法操作】:273626272626526352787655444307973700090979728351 【乘法操作】:7487133707148612483105394829405642141092152088260911606512239506052 【除法操作】:10000000000000000001010701350 |
注意:虽然提供了大数字的操作类,但是随着数字位数的增加,那么运行性能会越慢。
从上面程序中可以观察出,在进行数学除法的时候有可能无法进行整除处理,所以,可以使用其他的除法计算来求出余数:
在BigInteger类中定义了一个方法可以使用:
方法 | 定义 | 代码 | 结果 | 描述 |
求余 | public BigInteger[] divideAndRemainder(BigInteger val) | package cn.demos; import java.math.BigInteger; public class JavaAPIDemo { public static void main(String[] args) throws Exception { BigInteger bigA = new BigInteger("2736262726253632363627"); BigInteger result[] = bigA.divideAndRemainder(bigB); } | 【商】:1000000000092、【余数】:1896192835 | 数组第一个元素为商,第二个元素为余数 |
提示:若在开发中该计算没有超过基本数据类型所包含的位数,不建议使用大数字类,因为此计算的性能很差。
BigDecimal类和BigInteger类的操作形式很相似,都有基础的数学支持。
范例:使用BigDecimal计算
代码 | 结果 |
package cn.demos; import java.math.BigDecimal; public class JavaAPIDemo { public static void main(String[] args) throws Exception { BigDecimal bigA = new BigDecimal("655444532224556"); System.out.println("【加法计算】:" + bigA.add(bigB)); BigDecimal result[] = bigA.divideAndRemainder(bigB); } | 【加法计算】:655444564449112 除法计算【商】:20339908、【余数】:27843708 |
这两个计算基本相似,唯一差别在于一个进行整数计算,一个进行小数计算。
在BigDecimal类中还有一个数据进位问题,除法计算:
方法 | 定义 |
除法计算 | public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) |
范例:使用BigDecimal实现四舍五入处理
代码 | 结果 |
package cn.demos; import java.math.BigDecimal; class MathUtil { public static double round(double num, int scale) { return new BigDecimal(num).divide(new BigDecimal(1.0), scale, RoundingMode.HALF_UP).doubleValue(); } public class JavaAPIDemo { public static void main(String[] args) throws Exception { System.out.println(MathUtil.round(19.652, 2)); } } | 19.65 |