数字操作类

1.1 Math类
Math类是一个数字的处理程序类,在Math类中提供有一系列的数学处理公式。在Math类中提供的所有方法都属于static方法,那么就表示这个类的方法可以使用静态导入完成,同事这个类中没有属性的。
在Math类重点观察一个方法:public static long round(double a),实现四舍五入的操作。

范例:实现四舍五入的操作

package day2;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        System.out.println(Math.round(15.12));//15
        System.out.println(Math.round(15.62));//16
        System.out.println(Math.round(-15.12));//-15
        //如果是负数,小数位超过0.5,就会进行进位
        System.out.println(Math.round(-15.62));//-16
    }
}

使用四舍五入的操作固然是好,但是整个代码的操作过程里面会发现一个问题,小数位都没了。所以现在就会发现一点问题:此时的程序代码并不可能被现实开发使用。

在Math类中提供了一个pow()方法。

package day2;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        System.out.println(Math.pow(10.0,5));
    }
}
100000.0

round()本身就是不保留小数位的四舍五入操作,所以为了可以保存准确的小数位,那么必须进行一些有效的数学操作

范例:实现准确的四舍五入操作

package day2;

class MyMath{
    /**
     * 实现数字的四舍五入操作
     * @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);

}
}
public class TestDemo {
    public static void main(String[] args) throws Exception {
        System.out.println(MyMath.round(10.981624,4));
    }
}
10.9816

这种代码一般属于工具代码,能使用就行了

1.2 Random 类
java.util 包中,这个类的主要功能是产生随机数使用的,在这个类中有如下的几个方法:
(1)构造方法:public Random(),实现Random类实例化对象;
(2)public Random(long seed),设置种子数
(3)public int nextInt(int bound):下一个伪随机数,从这个随机数发生器的序列中均匀 int到零(包括)和 bound (排他)之间的值int
(4)public double nextDouble():返回下一个伪随机数,从该随机数发生器的序列中0.0和1.0之间的double值。

范例:观察如下代码

package day2;

import java.util.Random;

class MyMath{
    /**
     * 实现数字的四舍五入操作
     * @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);

}
}
public class TestDemo {
    public static void main(String[] args) throws Exception {
        Random random = new Random();
        for(int i = 0;i < 10 ;i++){
            System.out.print(random.nextInt(100) + ",");;
        }
        System.out.println();
        for(int i = 0;i < 10 ;i++){
            System.out.print(random.nextDouble() + "、");;
        }
    }
}
43,8,95,55,90,94,83,36,97,40,
0.4252463536096198、0.9260872856820747、0.4082643483524321、0.3181769293856873、0.32165576551951447、0.3331910543131521、0.02517927850022772、0.010002091011383718、0.3206828649776321、0.42221586815409196、

大部分的情况下使用int作为随机数的最为方便的。

范例:设置种子数

package day2;

import java.util.Random;
public class TestDemo {
    public static void main(String[] args) throws Exception {
        Random random = new Random(567);
        for(int i = 0;i < 10 ;i++){
            System.out.print(random.nextInt(100) + ",");;
        }
    }
}
27,1,94,82,34,85,31,81,16,31,

实际上现在可以利用这个随机数实现一个36选7的操作。

范例:数字不能重复,不能有0,不能大于36

package day2;

import java.util.Arrays;
import java.util.Random;
public class TestDemo {
    public static void main(String[] args) throws Exception {
        int data[] = new int[7];//生成一个数组,保存7个最值号码
        ch(data);
        Arrays.sort(data);
        print(data);
    }
    public static void print(int temp[]){
        for(int i = 0 ;i < temp.length; i++){
            System.out.print(temp[i] + "、");
        }
    }
    public static void ch(int temp[]){
        int foot = 0 ;//作为数组的操作脚标
        Random random = new Random();
        while (foot < 7){//表示数组中的内容还没有选足
            int num = random.nextInt(37);
            if(num != 0){//保证数据不能为0
                if(!isRepeat( temp,num)){//不存在
                    temp[foot++] = num;
                }
            }
        }
    }

    /**
     * 判断选定的内容是否存在
     * @param temp 要判断的数组数据
     * @param num 要生成的数字
     * @return 如果存在则返回true,表示不可使用
     */
    public static boolean isRepeat(int temp[],int num){
        for(int i = 0;i< temp.length;i++){
            if(temp[i] == num){
               return true;
            }
        }
        return false;
    }
}
3、8、11、15、20、26、31、

1.3 BigInteger 类
如果说现在有一个数字非常非常大,已经超过了double的范围,那么最初的设计思路是将其变成String保存,而后将String变成字符数组,一个一个字符进行计算操作。所以在最早的时候这样的大数字操作时非常繁琐的。
为了简化其操作专门提供了java.mang.BigInteger,BigInteger是Number的一个子类
(1)构造方法:public BigInteger(String val);
(2)加法操作:public BigInteger add(BigInteger val);
(3)减法操作:public BigInteger subtract(BigInteger val);
(4)乘法操作:public BigInteger multiply(BigInteger val);
(5)除法操作:public BigInteger divide(BigInteger val)
(6)除法操作:public BigInteger[] divideAndRemainder(BigInteger val),数字第一个内容保存的是商,第二个内容保存的是余数;

范例:实现基本的四则运算

package day2;

import java.math.BigInteger;

public class TestDemo {
    public static void main(String[] args) throws Exception {
        BigInteger bigA = new BigInteger("45965123654878965412354");
        BigInteger bigB = new BigInteger("4955412354");
        System.out.println("加法操作:bigA + bigB = " +bigA.add(bigB));
        System.out.println("减法操作:bigA - bigB = " +bigA.subtract(bigB));
        System.out.println("乘法操作:bigA * bigB = " +bigA.multiply(bigB));
        System.out.println("除法操作:bigA / bigB = " +bigA.divide(bigB));
        
        BigInteger result[] = bigA.divideAndRemainder(bigB);
        System.out.println("除法操作:bigA / bigB :" + " 商 = " + result[0] + " ,余数 = " + result[1]);
    }
}
加法操作:bigA + bigB = 45965123654883920824708
减法操作:bigA - bigB = 45965123654874010000000
乘法操作:bigA * bigB = 227776141612524857579117715821316
除法操作:bigA / bigB = 9275741425993
除法操作:bigA / bigB : 商 = 9275741425993 ,余数 = 3676494832

虽然java提供了BigInteger工具类,但是这个类不可能胜任复杂的数学计算。

1.4 BigDecimal 类

BigDecimal与BigInteger类相同,唯一的差别在于BigDecimal类保存的是小数,BigDecimal也属于Number的一个子类,同时在BigDecimal 类中定义有如下的构造方法:
(1)public BigDecimal(int val);
(2)public BigDecimal(long val);
(3)public BigDecimal(double val);
(4)public BigDecimal(String val);
(5)public BigDecimal(BigInteger val);

在BigDecimal类中最早也提供与四舍五入的支持,但是这个支持是利用除非操作实现的:public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode);
(1)进位模式:public static final int ROUND_HALF_UP

范例:四舍五入,进位模式

package day2;

import java.math.BigDecimal;
import java.math.BigInteger;

class MyMath{
    public static double round(double num,int scale){
        //scale:保留小数,ROUND_HALF_UP向上进位
        return new BigDecimal(num).divide(new BigDecimal(1),scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}
public class TestDemo {
    public static void main(String[] args) throws Exception {
        System.out.println(MyMath.round(-15.56555,3));
        System.out.println(MyMath.round(-15.56555,2));
        System.out.println(MyMath.round(-15.50555,0));
        System.out.println(MyMath.round(-15.125355,3));

        System.out.println(MyMath.round(45.50555,0));
        System.out.println(MyMath.round(65.125355,3));
    }
}
-15.566
-15.57
-16.0
-15.125
46.0
65.125

总结
(1)几乎所有的编程语言都会提供有与Math类相似的功能;
(2)Random生成随机数操作;
(3)使用 BigInteger 和 BigDecimal操作大数字
(4)四舍五入运算掌握