不慌不慌,面試加油

Java 的隨機數

  • Java 的隨機數的產生有三種方式:
    ①、通過 System.currentTimeMillis() 來獲取一個當前時間毫秒數的 long 型數字。
    ②、通過 Math.random() 能夠返回帶正號的double值,該值大於等於0.0且小於1.0,即取值範圍是[0.0,1.0)的左閉右開區間,返回值是一個僞隨機選擇的數,在該範圍內(近似)均勻分佈。
    ③、通過 Random 類來產生一個隨機數,這個是專業的 Random 工具類,功能強大。無參數構造方法(不設置種子)具有更強的隨機性,能夠滿足一般統計上的隨機數要求。使用有參的構造方法(設置種子)無論你生成多少次,每次生成的隨機序列都相同,名副其實的僞隨機。
    ④、使用 RandomUtils 方法返回隨機數。返回指定訪問的隨機數。
    在這裏插入圖片描述
    在這裏插入圖片描述

Java 中的 BigDecimal

Java 在 java.math 包中提供的 API 類 BigDecimal,用來對超過 16位有效位的數進行精確的計算。
對於那些不需要準確計算精度的數字,我們可以直接使用 Float 和 Double處理,但是 **Double.valueOf(String)Float.valueOf(String)**會丟失精度。所以在開發過程總使用精確的計算必須使用 BigDecima 類來操作。

  • 常用構造函數
構造函數 解釋
BigDecimal(int) 創建一個具有參數所指定整數值的對象
BigDecimal(double) 創建一個具有參數所指定雙精度值的對象
BigDecimal(long) 創建一個具有參數所指定單精度值的對象
BigDecimal(String) 創建一個具有參數所指定以字符串表示的數值的對象

在這裏插入圖片描述
在這裏插入圖片描述

  • 1.常用方法
方法名稱 參數 作用 返回值
add BigDecimal 與對象值進行加法運算 BigDecimal
subtract BigDecimal 與對象值進行相減運算 BigDecimal
multiply BigDecimal 與對象中的值進行相乘 BigDecimal
toString 將對象中的值轉成字符串 String
doubleValue 將對象中的值轉成雙精度浮點型 double
floatValue 將對象中的值轉成單精度浮點型 float
longValue 將對象中的值轉成長整型 long
intValue 將對象中的值轉成整型 int
  • 2.BigDecimal 大小比較
  • compareTo 對值進行比較
    在這裏插入圖片描述
  • 3. BigDecimal 的格式化

由於 NumberFormat 類(數字格式化類)的 format() 方法可以使用 BigDecimal 對象作爲其參數,可以利用 BigDecimal 對超出 16 位有效數字的貨幣值、百分值,以及一般數值進行格式化控制。

創建 BigDecimal 對象,進行 BigDecimal 的算術運算後,分別建立對貨幣和百分比格式化的引用,最後利用 BigDecimal 對象作爲 format() 方法參數,輸出其格式化的貨幣和百分比。

在這裏插入圖片描述

NumberFormat 數值格式化類與 DecimalFormat
  1. NumberFormat 是所有數值格式的抽象基類。此類提供格式化和解析數值的接口。
  2. NumberFormat 可用於格式化和解析任何語言環境的數值。使代碼能夠完全獨立於小數點、千位分隔符甚至所用特定小數位數的語言環境約定,並與數值格式是否爲偶小數無關。
函數 表述
getInstance()、getNumberInstance()。 返回當前默認語言環境的通用數值格式。
getInstance(Locale)、getNumberInstance(Locale)。 返回指定語言環境的通用數值格式。
NumberFormat.setMinimumIntegerDigits(int)。 設置數的整數部分所允許的最小位數。
NumberFormat.setMaximumIntegerDigits(int)。 設置數的整數部分所允許的最大位數。
NumberFormat.setMinimumFractionDigits(int)。 設置最少小數點位數,不足的位數以0補位,超出的話按實際位數輸出。
NumberFormat.setMaximumFractionDigits(int)。 設置最多保留小數位數,不足不補0。

在這裏插入圖片描述

DecimalFormat

表述
“0” 表示一位數值,如沒有,顯示0。如“0000.0000”,整數位或小數位>4,按實際輸出,<4整數位前面補0小數位後面補0,湊足4位
“#” 表示任意位數的整數。如沒有,則不顯示。在小數點位使用,只表示一位小數,超出部分四捨五入。
“#” 無小數,小數部分四捨五入。
“.#” 整數部分不變,一位小數,四捨五入。
“.##” 整數部分不變,二位小數,四捨五入。
“.” 表示小數點。
“,” 與模式“0”一起使用,表示逗號。

在這裏插入圖片描述

總結,本文所有代碼如下

package cn.chao.zero.test.Javaapi;

import org.apache.commons.lang3.RandomUtils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.util.Random;

/**
 * TODO
 *
 * @author RobertChao
 * @date 2020/5/31 21:34
 * @see cn.chao.zero.test.Javaapi
 */
public class MathTest {

    public static void main(String[] args) {
        System.out.println(Math.round(-0.5));
        System.out.println(Math.round(0.5));
        System.out.println("System.currentTimeMillis() ="+System.currentTimeMillis()%100);
        System.out.println("Math.random() ="+Math.random());
        // 未攜帶種子 [0, 5)
        System.out.println("未攜帶種子  new Random().nextInt(5) ="+new Random().nextInt(5));
        System.out.println("未攜帶種子  new Random().nextInt(5) ="+new Random().nextInt(5));
        // 攜帶種子 [0, 5)
        System.out.println("攜帶種子 new Random(10).nextInt(5) ="+new Random(10).nextInt(5));
        System.out.println("攜帶種子 new Random(10).nextInt(5) ="+new Random(10).nextInt(5));
        System.out.println("返回指定的隨機數 ="+RandomUtils.nextInt(1, 10));;

        // 阿里代碼規範:禁止使用 new BigDecimal(double)構造函數的方式把 double 類型轉換爲 BigDecimal 對象。
        // 結果不可預知,
        // 當 double 必須用作 BigDecimal 的源時,先使用 Double.toString(double) 方法,然後使用 BigDecimal(String) 構造方法,將 double 轉換爲 String 。
        BigDecimal bigDecimal = new BigDecimal(0.1);
        System.out.println(bigDecimal);
        // String 構造方法是完全可以預知的。
        BigDecimal decimal = new BigDecimal("0.1");
        System.out.println(decimal);
        // BigDecimal 的使用 比較大小
        BigDecimal decimal1 = new BigDecimal("0.1");
        BigDecimal decimal2 = new BigDecimal("0.2");
        int i = decimal1.compareTo(decimal2);
        switch(i){
            case 1:
                System.out.println("大於");
                break;
            case 0:
                System.out.println("等於");
                break;
            case -1:
                System.out.println("小於");
                break;
            default:
                System.out.println("無");
                break;
        }

        // 格式化內容
        // 建立貨幣類型的格式化  currency 貨幣
        NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
        // 建立百分比的格式化 percent 百分比
        NumberFormat percentInstance = NumberFormat.getPercentInstance();
        // 百分比小數點三位
        percentInstance.setMaximumFractionDigits(2);
        System.out.println("貸款金額:"+ currencyInstance.format(new BigDecimal("1500")));
        System.out.println("百分比:"+ percentInstance.format(new BigDecimal("0.1314")));
        System.out.println("計算結果:"+ currencyInstance.format(decimal1.multiply(decimal2)));
        // 0.00 的貨幣格式設置
        System.out.println(formatNumber(new BigDecimal("0.00000")));
        System.out.println(formatNumber(new BigDecimal("0.234")));
        System.out.println(formatNumber(new BigDecimal("1.234")));
        // numberFormat 的使用
        numberFormat();
        // decimalFormat 的使用
        decimalFormat();
    }

    // 貨幣價值設置
    public static String formatNumber(BigDecimal bigDecimal) {
        DecimalFormat format = new DecimalFormat("0.00");
        if (BigDecimal.ZERO.compareTo(bigDecimal)==0) {
            return "0.00";
        } else if ((BigDecimal.ZERO.compareTo(bigDecimal) > 0) && (BigDecimal.ONE.compareTo(bigDecimal)<0)) {
            return "0"+format.format(bigDecimal);
        } else {
            return format.format(bigDecimal);
        }
    }

    /**
     * numberFormat 的測試方法
     */
    private static void numberFormat() {
        double d = 12345.676688000;
        NumberFormat nf = NumberFormat.getNumberInstance();
        // 12,345.677 默認只保留到小數點後三位
        System.out.println(nf.format(d));
        nf.setMinimumIntegerDigits(2);
        // 12,345.677 整數部分大於2位按默認最大小數位數3位輸出
        System.out.println(nf.format(d));
        nf.setMaximumIntegerDigits(3);
        // 345.677 整數3位,默認小數位數 3 位輸出
        System.out.println(nf.format(d));
        d = 1234.0;
        nf.setMaximumIntegerDigits(3);
        // 234  整數部分最多3位,默認小數位數 3 位。
        System.out.println(nf.format(d));
        // -------------------------------
        nf = NumberFormat.getInstance();
        d = 12345.6766;
        nf.setMinimumFractionDigits(1);
        // 12,345.677 小數部分大於1位,按默認最大小數位數3位輸出
        System.out.println(nf.format(d));
        nf.setMinimumFractionDigits(5);
        // 12,345.67660 不夠位數補0
        System.out.println(nf.format(d));
        nf.setMaximumFractionDigits(1);
        // 12,345.7 最大小數位爲 1 位,四捨五入。
        System.out.println(nf.format(d));
        //  ----------------------------- 英國
        nf = NumberFormat.getNumberInstance(Locale.US);
        d = 12345.6789;
        // 12,345.679  三位整數逗號隔開
        System.out.println(nf.format(d));
        // -----------------------------  法國
        nf = NumberFormat.getNumberInstance(Locale.FRANCE);
        // 12 345,679  三位整數空格隔開
        System.out.println(nf.format(d));
    }


    /**
     * decimalformat 的測試方法
     */
    private static void decimalFormat() {
        double d1 = 123456.789, d2 = 12.3456;
        DecimalFormat nf = new DecimalFormat("0000.000");
        // d1=123456.789 d2=0012.346
        System.out.println("d1=" + nf.format(d1) + " d2=" + nf.format(d2));
        nf = new DecimalFormat("#");
        // d1=123457
        System.out.println("d1=" + nf.format(d1));
        nf = new DecimalFormat(".####");
        // d1=123456.789
        System.out.println("d1=" + nf.format(d1));
        // d1=0012,3456.78900
        nf = new DecimalFormat("0000,0000.00000");
        System.out.println("d1=" + nf.format(d1));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章