1. 程式人生 > >開發中經常用到的數字處理類整理(Java)

開發中經常用到的數字處理類整理(Java)

1.DecimalForamt類

數字格式化的模板方法,通常有如下兩種形式;哪一種結果都一樣的…

    /**
     * 數字格式化第一種方法 
     * 第一個引數特殊字元的模板 
     * 第二個是要格式化的字元
     */
    public static void formatNumberFrist(String pattern, double value) {
        DecimalFormat format = new DecimalFormat(pattern);
        String output = format.format(value);
        System.out.println(pattern + "==="
+ output); } /** * 數字格式化第二種方法 */ public static void formatNumberSecond(String pattern, double value) { DecimalFormat format = new DecimalFormat(); format.applyPattern(pattern); String output = format.format(value); System.out.println(pattern + "==="
+ output); }

通常使用的特殊字元有如下:0,#,.,%,\u2030,\u00A4等,不一個個介紹了看程式碼吧


        // #表示數字的一位阿拉伯數字,如果該位存在數字,就顯示數字, 如果該位不存在數字,就不顯示數字
        formatNumberFrist("###", 12);// --->###===12
        formatNumberFrist("###", 123);// --->###===123
        formatNumberFrist("###", 1234);// --->###===1234

        // 0表示數字的一位阿拉伯數字,如果該位存在數字,就顯示數字, 如果該位不存在數字,就顯示0
formatNumberFrist("000", 12);// --->000===012 formatNumberFrist("000", 123);// --->000===123 formatNumberFrist("000", 1234);// --->000===1234 // 將小數點後格式化為兩位數 // .代表小數分隔符或貨幣小數分隔符 formatNumberFrist("####.##", 123.456789);// ####.##===123.46 formatNumberFrist("####.00", 123.456789);// ####.00===123.46 formatNumberFrist("0000.##", 123.4);// --->0000.##===0123.4 formatNumberFrist("0000.00", 123.4);// --->0000.00===0123.40 // %表示若放置在數字的字首或字尾,將數字乘以100顯示 formatNumberFrist("#.###%", 0.789);// --->#.###%===78.9% formatNumberFrist("%#.###", 0.789);// --->%#.###===%78.9 // \u2030放置在數字的字首或字尾,將數字乘以1000顯示 formatNumberFrist("0.00\u2030", 0.789);// --->0.00‰===789.00‰ formatNumberFrist("\u20300.00", 0.789);// --->‰0.00===‰789.00 // \u00A4放置在數字的字首或字尾,作為貨幣符號顯示 formatNumberFrist("##\u00A4", 1.23);// --->##¤===1¥ // ,表示分組分隔符,分組分隔符的分組大小等於 // 最後一個分隔符和整數結尾之間的間隔才是使用的分組大小(不管有多少個分隔符) // 比如下面這個數100000000的分組大小就是3,因為,和.之間只有3個數 formatNumberFrist("##,#,###", 100000000);

2.Math類


        // Math.ceil(Double a)返回大於等於(>=a)的最大整數
        System.out.println(Math.ceil(1.3));// 2.0

        // Math.floor(Double a)返回小於等於(<=a)的最大整數
        System.out.println(Math.floor(1.3));// 1.0

        // Math.rint(Double a)返回離a最近的整數,如果同為整數且同樣接近則取偶數
        System.out.println(Math.rint(0.5));// 0.0
        System.out.println(Math.rint(1.5));// 2.0
        System.out.println(Math.rint(0.3));// 0.0

        // Math.round(Double a)將引數(a+0.5)之後向下取整整數,
        System.out.println(Math.round(1.4));// 1 加上0.5之後變成1.9向下取整等於1
        System.out.println(Math.round(1.5));// 1 加上0.5之後變成2向下取整等於2
        System.out.println(Math.round(1.6));// 2 加上0.5之後變成2.1向下取整等於2
        System.out.println(Math.round(-1.4));// -1 加上0.5之後變成-0.9向下取整等於-1
        System.out.println(Math.round(-1.5));// -1 加上0.5之後變成-1向下取整等於-1
        System.out.println(Math.round(-1.6));// -2 加上0.5之後變成-1.1向下取整等於-2

        // Math.max()取最大值
        System.out.println(Math.max(1, 2));// 2
        // Math.min()取最小值
        System.out.println(Math.min(1, 2));// 2
        // Math.abs()取絕對值
        System.out.println(Math.abs(-100));// 100

        // Math.random()產生0~1之間的double型數字
        System.out.println(Math.random());// 結果等於(0<=Math.random()<1.0)

3.Random類

1、Random物件的生成
Random類包含兩個構造方法,下面依次進行介紹:
public Random()

該構造方法使用一個和當前系統時間對應的相對時間有關的數字作為種子數,然後使用這個種子數構造Random物件。
public Random(long seed)
等價於
Random rnd = new Random();
rnd.setSeed(seed);

該構造方法可以通過制定一個種子數進行建立。

示例程式碼:

Random r = new Random();

Random r1 = new Random(10);

再次強調:種子數只是隨機演算法的起源數字,和生成的隨機數字的區間無關。
上面兩種構造方法隨便使用任意一個就可以建立物件,沒有什麼區別,但是Random物件隨機生成每一個數字機率是均等的,下面看程式碼

        Random r = new Random();

        // nextDouble()生成[0,1.0)區間的小數
        System.out.println(r.nextDouble());

        // 生成[0,5.0)區間的小數
        System.out.println(r.nextDouble() * 5);

        // 生成[1,2.5)區間的小數
        System.out.println(r.nextDouble() * 1.5 + 1);

        // nextFloat()生成[0.0f,1.0f)區間的小數
        System.out.println(r.nextFloat());

        // r.nextInt()生成任意整數
        System.out.println(r.nextInt());

        // r.nextInt(n)生成[0,n)區間的整數
        System.out.println(r.nextInt(10));
        System.out.println(Math.abs(r.nextInt() % 10));
        // 首先呼叫nextInt()方法生成一個任意的int數字,該數字和10取餘以後生成的數字區間為(-10,10)
        // 然後再對該區間求絕對值,則得到的區間就是[0,10)了。

        // r.nextBoolean()生成一個任意boolean
        System.out.println(r.nextBoolean());

        // r.nextLong()生成一個長整形
        System.out.println(r.nextLong());

相同種子數的Random物件,相同次數生成的隨機數字是完全相同的:

                        Random r1 = new Random(10);
                        Random r2 = new Random(10);
                        for(int i = 0;i < 2;i++){
                                 System.out.println(r1.nextInt());
                                 System.out.println(r2.nextInt());
                        }

在該程式碼中,物件r1和r2使用的種子數都是10,則這兩個物件相同次數生成的隨機數是完全相同的。
如果想避免出現隨機數字相同的情況,則需要注意,無論專案中需要生成多少個隨機數字,都只使用一個Random物件即可。

4.BigDecimal類

這個類專門用於商業大數字運算(加減乘除)

        BigDecimal m1 = new BigDecimal(12);
        BigDecimal m2 = new BigDecimal(5);
        // 加
        System.out.println(m1.add(m2));// 17
        // 減
        System.out.println(m1.subtract(m2));// 7
        // 乘
        System.out.println(m1.multiply(m2));// 60
        // 除
        System.out.println(m1.divide(m2, 2,BigDecimal.ROUND_HALF_UP));//2.40

其中divide(BigDecimal divisor,int scale,int mode)引數含義如下:
scale: 商的小數點後的位數;
mode:近似處理模式,這裡BigDecimal.ROUND_HALF_UP表示四捨五入操作;