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
- NumberFormat 是所有數值格式的抽象基類。此類提供格式化和解析數值的接口。
- 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));
}
}