1 Math数学计算类
程序就是一个数学的处理过程,所以在Java语言本身也提供有数字处理的类库支持。
Math类的主要功能是进行数学计算的操作类,提供有基础的计算公式,这个类的构造方法被私有化了,但不是单例,该类中的所有方法都是static型的方法,即:这些方法都可以通过类名称直接调用。
范例:Math类测试
package cn.victor.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
System.out.println(Math.abs(-15));
System.out.println(Math.round(-15.49)); //-15
System.out.println(Math.round(-15.5)); //-15
System.out.println(Math.round(-15.51)); //-16
System.out.println(Math.round(15.4)); //15
System.out.println(Math.round(15.5)); //16
System.out.println(Math.round(15.51)); //16
}
}
虽然在Math类里面提供有四舍五入的处理方法,但是这个四舍五入在进行处理的时候是直接将小数点后的所有位进行进位处理了,这样肯定不方便,那么现在最方便的做法是可以实现指定位数的保留。
范例:自定义四舍五入
package cn.victor.demo;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
System.out.println(myRound(-19.555,2));
}
public static double myRound(double num, int scale) {
return Math.round(num * Math.pow(10, scale)) / Math.pow(10, scale);
}
}
Math类里面提供的基本上都是基础的数学公式,需要的时候需要自己重新整合。
2 Random随机数生成类
java.util.Random类的主要功能是产生随机数的,这个类主要是依靠内部提供的方法来完成:
(1)产生一个不大于边界的随机自然数:public int nextInt(int bound)
范例:产生随机数
import java.util.Random;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
for(int i = 0; i < 10; i++) {
System.out.print(new Random().nextInt(8) + " ");
}
}
}
范例:随机生成彩票号
package cn.victor.demo;
import java.util.Random;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
int []tickets = new int[7];
int foot = 0;
while(foot < 7) {
int num = new Random().nextInt(37);
if(isRepeat(tickets, num)) {
tickets[foot++] = num;
}
}
for(int i = 0; i < tickets.length; i++) {
System.out.print(tickets[i] + " ");
}
}
public static boolean isRepeat(int[] tickets, int num) {
if(num <= 0) {
return false;
}
for(int i = 0; i < tickets.length; i++) {
if( num == tickets[i]) {
return false;
}
}
return true;
}
}
以后随机的操作都可以利用Random来处理。
3 大数字处理类
在进行数学计算的过程里面还有一个大数字的操作类,可以实现海量数字的计算(能提供的也只是基础计算):BigInteger和BigDecimal。
当数字很大的时候只能够利用字符串描述数字操作,所以这一点可以观察两个大数字操作的构造方法:
(1)BigInteger类构造:public BigInteger(String val)
(2)BigDecimal构造:public BigDecimal(String val)
范例:使用BigInteger实现四则运算
package cn.victor.demo;
import java.math.BigInteger;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
BigInteger bigA = new BigInteger("43488532549352394395234");
BigInteger bigB = new BigInteger("434852394395234");
System.out.println(bigA.add(bigB));
System.out.println(bigA.subtract(bigB));
System.out.println(bigA.multiply(bigB));
System.out.println(bigA.divide(bigB));
}
}
需要注意的是,虽然提供有大数字操作类,但是整体的操作之中还是需要考虑到性能问题。
范例:考虑性能问题
package cn.victor.demo;
import java.math.BigInteger;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
BigInteger bigA = new BigInteger("43488532549352394395234");
BigInteger bigB = new BigInteger("434852394395234");
System.out.println(bigA.pow(Integer.MAX_VALUE));
}
}
此时的计算过程是非常缓慢的,所以任何的电脑有实有极限的。既然再进行数学除法的时候有可能无法进行整除的处理,那么就可以使用其他的除法计算来求出余数:
(1)求余:第一个数字为商,第二数字为余数。
范例:
package cn.victor.demo;
import java.math.BigInteger;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
BigInteger bigA = new BigInteger("43488532549352394395234");
BigInteger bigB = new BigInteger("434852394395234");
BigInteger[] result = bigA.divideAndRemainder(bigB);
System.out.println("商:" + result[0] + "余数:" + result[1]);
}
}
如果在开发之中真进行计算的时候,该计算没有超过基本数据所包含的位数,强烈不建议使用大数字类,因为这种计算性能是很差的。
BigDecimal操作性是和BigInteger非常类似,都提供基础的数学支持:
范例:
package cn.victor.demo;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class JavaAPIDemo {
public static void main(String[] args) throws Throwable {
BigDecimal bigA = new BigDecimal("43488532549352394395234");
BigDecimal bigB = new BigDecimal("4348523395234");
System.out.println(bigA.add(bigB));
System.out.println(bigA.subtract(bigB));
System.out.println(bigA.multiply(bigB));
System.out.println(bigA.divide(bigB, RoundingMode.HALF_UP));
}
}
但是在使用BigDecimal的时候有一个数据进位的问题,在类里面定义有如下的除法计算:
(1)除法计算:
范例:使用BigDecimal完成四舍五入
package cn.victor.demo;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class JavaAPIDemo {
public static double myRound(double num, int scale) {
return new BigDecimal(num).divide(new BigDecimal(1.0), scale, RoundingMode.HALF_UP).doubleValue();
}
public static void main(String[] args) throws Throwable {
System.out.println(myRound(19.86233, 2));
}
}
Math的处理由于使用的都是基本类型,所以性能一定要高于大数字处理类的。