1?? 概念
在現(xiàn)代軟件開發(fā)中,數(shù)學(xué)計(jì)算是不可或缺的一部分。為了滿足企業(yè)及開發(fā)人員對數(shù)學(xué)運(yùn)算的需求,Java 提供了一系列強(qiáng)大而豐富的數(shù)學(xué)計(jì)算相關(guān)類,其中包括Math
、Random
、BigDecimal
等等。這些類旨在提供高度精確和可靠的數(shù)學(xué)操作,使開發(fā)人員能夠處理任何規(guī)模和復(fù)雜度的定量問題。
?? 數(shù)學(xué)運(yùn)算類匯總
將Java中所有用于表示數(shù)學(xué)計(jì)算支持的類匯總,羅列如下表:
類名 | 描述 |
---|---|
Math |
提供常用數(shù)學(xué)函數(shù)和運(yùn)算符實(shí)現(xiàn) |
BigDecimal |
支持高精度任意精度定點(diǎn)數(shù)計(jì)算 |
BigInteger |
支持高精度任意精度整數(shù)計(jì)算 |
StrictMath |
與Math 類提供相同的方法,使用非嚴(yán)格浮點(diǎn)數(shù)語義 |
Random |
生成偽隨機(jī)數(shù)序列 |
DecimalFormat |
格式化數(shù)字輸出 |
MathContext |
提供精確的數(shù)學(xué)運(yùn)算上下文環(huán)境 |
以上這些類在Java中提供了廣泛的數(shù)學(xué)計(jì)算支持。它們可以執(zhí)行各種數(shù)值計(jì)算和操作,包括三角函數(shù)、指數(shù)、對數(shù)、冪、絕對值、最大值、最小值等。
BigDecimal
和 BigInteger
類具有處理任意精度整數(shù)和定點(diǎn)數(shù)計(jì)算的能力,而 Random
類用于生成偽隨機(jī)數(shù)。DecimalFormat
則用來格式化數(shù)字輸出,MathContext
提供了精確的數(shù)學(xué)運(yùn)算環(huán)境。這些類在各種場景下發(fā)揮重要作用,讓開發(fā)人員能夠進(jìn)行精確和高效的數(shù)學(xué)計(jì)算。
在本文中,主要介紹最常用的Math
、BigDecimal
、Random
等類的使用及操作方式等相關(guān)知識。而其他類的詳細(xì)操作方法API等信息,由于篇幅原因本文不再做更多介紹,感興趣的朋友可私信我一起交流。
-
Math
類是 Java 中的一個常見工具類,提供了許多靜態(tài)方法來執(zhí)行數(shù)學(xué)運(yùn)算。它支持三角函數(shù)、指數(shù)、對數(shù)、冪、絕對值、最大值、最小值等常用運(yùn)算。Math
類使用基本的浮點(diǎn)數(shù)運(yùn)算,適用于大多數(shù)簡單的數(shù)學(xué)計(jì)算。 -
BigDecimal
類是 Java 中用于執(zhí)行精確任意精度定點(diǎn)數(shù)計(jì)算的類。它可以處理極大和極小的數(shù)值,并提供高精度的計(jì)算結(jié)果。相比于Math
類中的浮點(diǎn)數(shù)運(yùn)算,BigDecimal
可以保證運(yùn)算結(jié)果的精度和準(zhǔn)確性; -
Random
類:用于生成偽隨機(jī)數(shù)。它的設(shè)計(jì)目標(biāo)是以可預(yù)測性和均勻分布性為基礎(chǔ),提供一種可靠的隨機(jī)數(shù)生成方式。
2?? 優(yōu)勢和缺點(diǎn)
-
Math
類
- 優(yōu)點(diǎn):靜態(tài)方法方便直接調(diào)用,不需要實(shí)例化對象;封裝了常見的數(shù)學(xué)運(yùn)算,提供了簡便的操作。
- 缺點(diǎn):基于基本浮點(diǎn)數(shù)運(yùn)算,可能導(dǎo)致精度損失,所以不適用于高精度計(jì)算。
-
BigDecimal
類
- 優(yōu)點(diǎn):提供任意精度的計(jì)算,避免了浮點(diǎn)數(shù)運(yùn)算導(dǎo)致的精度損失;支持基本的算術(shù)運(yùn)算、指數(shù)運(yùn)算等功能。
- 缺點(diǎn):內(nèi)存占用較大,運(yùn)算速度比基本數(shù)據(jù)類型慢。
-
Random
類
- 優(yōu)點(diǎn):提供了一系列方法來生成隨機(jī)數(shù),其使用簡單而直觀。在一般情況下,隨機(jī)數(shù)生成速度相對較快,適用于大多數(shù)應(yīng)用場景。
- 缺點(diǎn):生成的隨機(jī)數(shù)序列實(shí)際上是一個確定性的算法產(chǎn)生的,因此完全依賴于初始種子值。如果種子值不足夠隨機(jī),可能會導(dǎo)致生成的隨機(jī)數(shù)序列呈現(xiàn)明顯可預(yù)測的模式;生成的隨機(jī)數(shù)序列不適合用于加密或安全目的。
3?? 使用
3.1 各數(shù)學(xué)計(jì)算支持類使用案例
下面是一個示例程序,演示了如何使用Java中的一些數(shù)學(xué)計(jì)算支持類,包括:Math類、BigDecimal類、BigInteger類、Random類、DecimalFormat類、StrictMath類、MathContext類。代碼都有解釋說明,以便更好地理解其用法和功能:
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.text.DecimalFormat;
import java.util.Random;
public class MathSupportExample {
public static void main(String[] args) {
// Math 類示例
double squareRoot = Math.sqrt(16); // 計(jì)算平方根,結(jié)果為 4.0
System.out.println("Square root: " + squareRoot);
double power = Math.pow(2, 5); // 計(jì)算指數(shù),結(jié)果為 32.0
System.out.println("Power: " + power);
int absValue = Math.abs(-10); // 計(jì)算絕對值,結(jié)果為 10
System.out.println("Absolute value: " + absValue);
double randomNum = Math.random(); // 生成介于 [0,1) 的隨機(jī)浮點(diǎn)數(shù)
System.out.println("Random number: " + randomNum);
// BigDecimal 類示例
BigDecimal bigDecimal1 = new BigDecimal("10");
BigDecimal bigDecimal2 = new BigDecimal("3");
BigDecimal sum = bigDecimal1.add(bigDecimal2); // 相加,結(jié)果為 13
System.out.println("Sum: " + sum);
// BigInteger 類示例
BigInteger bigInteger1 = new BigInteger("10");
BigInteger bigInteger2 = new BigInteger("3");
BigInteger product = bigInteger1.multiply(bigInteger2); // 相乘,結(jié)果為 30
System.out.println("Product: " + product);
// Random 類示例
Random random = new Random();
int randInt = random.nextInt(100); // 生成 [0, 100) 范圍內(nèi)的隨機(jī)整數(shù)
System.out.println("Random integer: " + randInt);
// DecimalFormat 類示例
DecimalFormat decimalFormat = new DecimalFormat("#0.00");
double value = 3.14159265;
String formattedValue = decimalFormat.format(value); // 格式化數(shù)字為指定格式
System.out.println("Formatted value: " + formattedValue);
// StrictMath 類示例
double sinValue = StrictMath.sin(Math.PI / 2); // 計(jì)算正弦值,結(jié)果為 1.0
System.out.println("Sine value: " + sinValue);
double expValue = StrictMath.exp(1); // 計(jì)算e的指數(shù)冪,結(jié)果為 2.718281828459045
System.out.println("Exponential value: " + expValue);
double maxNum = StrictMath.max(10, 5); // 比較兩個數(shù),返回較大值,結(jié)果為 10
System.out.println("Maximum number: " + maxNum);
// MathContext 類示例
BigDecimal bigDecimal = new BigDecimal("3.14159265359");
MathContext mathContext = new MathContext(4); // 設(shè)置精確度為4位
BigDecimal roundedValue = bigDecimal.round(mathContext); // 四舍五入至指定精確度,結(jié)果為 3.142
System.out.println("Rounded value: " + roundedValue);
}
}
此示例程序演示了如何使用Math
類進(jìn)行數(shù)學(xué)運(yùn)算、BigDecimal
和BigInteger
類進(jìn)行高精度計(jì)算、Random
類生成偽隨機(jī)數(shù)、DecimalFormat
類格式化輸出。
還展示了如何使用StrictMath
類提供與Math
類相同的方法,但使用非嚴(yán)格浮點(diǎn)數(shù)語義,如計(jì)算正弦值、指數(shù)函數(shù)和比較兩個數(shù)。如何使用MathContext
類來控制BigDecimal
對象的精度。
運(yùn)行結(jié)果如下:
Square root: 4.0
Power: 32.0
Absolute value: 10
Random number: 0.15580789544457363
Sum: 13
Product: 30
Random integer: 23
Formatted value: 3.14
Sine value: 1.0
Exponential value: 2.7182818284590455
Maximum number: 10.0
Rounded value: 3.142
3.2 Math類
Math
類是Java中一個常用且便捷的數(shù)學(xué)支持類,它提供了基本的數(shù)學(xué)運(yùn)算和常量,可以滿足大多數(shù)的數(shù)學(xué)計(jì)算需求。
下面是Java的Math
類中的全部操作方法API的簡要介紹,以表格形式列舉如下:
方法 | 描述 |
---|---|
random() |
返回一個[0, 1)范圍內(nèi)的隨機(jī)浮點(diǎn)數(shù) |
round(float a) |
返回一個浮點(diǎn)數(shù)四舍五入為最接近的整數(shù) |
round(double a) |
返回一個雙精度浮點(diǎn)數(shù)四舍五入為最接近的整數(shù) |
ceil(double a) |
返回大于或等于給定浮點(diǎn)數(shù)的最小整數(shù) |
floor(double a) |
返回小于或等于給定浮點(diǎn)數(shù)的最大整數(shù) |
max(int a, int b) |
返回兩個整數(shù)中較大的那個值(方法重載,還支持操作:長整數(shù)、浮點(diǎn)數(shù)) |
min(int a, int b) |
返回兩個整數(shù)中較小的那個值(方法重載,還支持操作:長整數(shù)、浮點(diǎn)數(shù)) |
— | — |
abs(int a) |
返回一個整數(shù)的絕對值(方法重載,還支持操作:長整數(shù)、浮點(diǎn)數(shù)) |
exp(double a) |
返回指數(shù)函數(shù) e x e^x ex 的值 |
log(double a) |
返回一個數(shù)的自然對數(shù)(以e為底) |
pow(double a, double b) |
返回一個數(shù)的指定次冪 |
sqrt(double a) |
返回一個數(shù)的平方根 |
— | — |
sin(double a) |
返回一個角度的正弦函數(shù)值 |
cos(double a) |
返回一個角度的余弦函數(shù)值 |
tan(double a) |
返回一個角度的正切函數(shù)值 |
asin(double a) |
返回一個角度的反正弦函數(shù)值 |
acos(double a) |
返回一個角度的反余弦函數(shù)值 |
atan(double a) |
返回一個角度的反正切函數(shù)值 |
toDegrees(double angrad) |
將弧度轉(zhuǎn)換為角度 |
toRadians(double angdeg) |
將角度轉(zhuǎn)換為弧度 |
— | — |
ulp(float f) |
返回浮點(diǎn)數(shù)的最小單位 |
ulp(double d) |
返回雙精度浮點(diǎn)數(shù)的最小單位 |
下面是一個示例程序,演示了如何使用Math
類中的一些方法:
import java.util.Random;
public class MathExample {
public static void main(String[] args) {
// random()
double randomValue = Math.random(); // 生成[0,1)范圍內(nèi)的隨機(jī)浮點(diǎn)數(shù)
System.out.println("Random value: " + randomValue);
// round(double a)
double roundedValue = Math.round(3.7); // 四舍五入為最接近的整數(shù),結(jié)果為4
System.out.println("Rounded value: " + roundedValue);
// ceil(double a)
double ceilValue = Math.ceil(3.2); // 返回大于或等于給定浮點(diǎn)數(shù)的最小整數(shù),結(jié)果為4
System.out.println("Ceil value: " + ceilValue);
// floor(double a)
double floorValue = Math.floor(3.8); // 返回小于或等于給定浮點(diǎn)數(shù)的最大整數(shù),結(jié)果為3
System.out.println("Floor value: " + floorValue);
// max(int a, int b)
int maxValue = Math.max(10, 7); // 返回兩個整數(shù)中較大的那個值,結(jié)果為10
System.out.println("Max value: " + maxValue);
// min(int a, int b)
int minValue = Math.min(5, 3); // 返回兩個整數(shù)中較小的那個值,結(jié)果為3
System.out.println("Min value: " + minValue);
// abs(int a)
int absoluteValue = Math.abs(-10); // 返回一個整數(shù)的絕對值,結(jié)果為10
System.out.println("Absolute value: " + absoluteValue);
// exp(double a)
double exponentialValue = Math.exp(1); // 計(jì)算e的指數(shù)冪,結(jié)果為2.718281828459045
System.out.println("Exponential value: " + exponentialValue);
// log(double a)
double logarithm = Math.log(Math.E); // 返回一個數(shù)的自然對數(shù)(以e為底),結(jié)果為1.0
System.out.println("Logarithm value: " + logarithm);
// pow(double a, double b)
double power = Math.pow(2, 3); // 返回一個數(shù)的指定次冪,結(jié)果為8.0
System.out.println("Power value: " + power);
// sqrt(double a)
double squareRoot = Math.sqrt(25); // 返回一個數(shù)的平方根,結(jié)果為5.0
System.out.println("Square root value: " + squareRoot);
// sin(double a)
double sineValue = Math.sin(Math.PI / 6); // 返回一個角度的正弦函數(shù)值,結(jié)果為0.5
System.out.println("Sine value: " + sineValue);
// asin(double a)
double arcsineValue = Math.asin(0.5); // 返回一個角度的反正弦函數(shù)值,結(jié)果為0.5235987755982989
System.out.println("Arcsine value: " + arcsineValue);
// toDegrees(double angrad)
double degrees = Math.toDegrees(Math.PI / 4); // 將弧度轉(zhuǎn)換為角度,結(jié)果為45.0
System.out.println("Degrees value: " + degrees);
// toRadians(double angdeg)
double radians = Math.toRadians(90); // 將角度轉(zhuǎn)換為弧度,結(jié)果為1.5707963267948966
System.out.println("Radians value: " + radians);
// ulp(float f)
float ulpValueFloat = Math.ulp(1.23f); // 返回浮點(diǎn)數(shù)的最小單位,結(jié)果為1.1920929E-7
System.out.println("Ulp value (float): " + ulpValueFloat);
// ulp(double d)
double ulpValueDouble = Math.ulp(1.23); // 返回雙精度浮點(diǎn)數(shù)的最小單位,結(jié)果為2.220446049250313E-16
System.out.println("Ulp value (double): " + ulpValueDouble);
}
}
這個示例程序演示了如何使用Math
類中的各種方法。它包括生成隨機(jī)數(shù)、數(shù)值舍入四舍五入、向上取整和向下取整、比較兩個數(shù)的大小、計(jì)算絕對值、指數(shù)函數(shù)、對數(shù)、冪函數(shù)、平方根、三角函數(shù)(正弦、反正弦)、角度和弧度之間的轉(zhuǎn)換、浮點(diǎn)數(shù)最小單位等操作。這些方法可以在各種數(shù)學(xué)計(jì)算場景中使用,以滿足不同的需求。
運(yùn)行結(jié)果如下:
Random value: 0.7044894178514141
Rounded value: 4.0
Ceil value: 4.0
Floor value: 3.0
Max value: 10
Min value: 3
Absolute value: 10
Exponential value: 2.718281828459045
Logarithm value: 1.0
Power value: 8.0
Square root value: 5.0
Sine value: 0.49999999999999994
Arcsine value: 0.5235987755982989
Degrees value: 45.0
Radians value: 1.5707963267948966
Ulp value (float): 1.1920929E-7
Ulp value (double): 2.220446049250313E-16
3.3 BigDecimal類
BigDecimal
類是Java中用于精確計(jì)算的高精度數(shù)值運(yùn)算類。它提供了基本的數(shù)學(xué)運(yùn)算操作,比如加法、減法、乘法、除法、取余、冪等等。在大數(shù)據(jù)計(jì)算和金融應(yīng)用等場景中,BigDecimal
類可以保證計(jì)算結(jié)果的精確性和準(zhǔn)確性。
下面是BigDecimal
類中的全部操作方法API的匯總介紹:
方法 | 描述 |
---|---|
add(BigDecimal augend) |
將此BigDecimal與指定BigDecimal相加 |
subtract(BigDecimal subtrahend) |
從此BigDecimal中減去指定BigDecimal |
multiply(BigDecimal multiplicand) |
將此BigDecimal與指定BigDecimal相乘 |
divide(BigDecimal divisor) |
將此BigDecimal除以指定BigDecimal |
remainder(BigDecimal divisor) |
返回此BigDecimal除以指定BigDecimal的余數(shù) |
pow(int n) |
返回此BigDecimal的n次冪 |
setScale(int newScale, RoundingMode roundingMode) |
將此BigDecimal的標(biāo)度設(shè)置為指定值,并進(jìn)行舍入操作 |
abs() |
返回此BigDecimal的絕對值 |
negate() |
返回此BigDecimal的相反數(shù) |
compareTo(BigDecimal val) |
將此BigDecimal與指定BigDecimal進(jìn)行比較,返回一個負(fù)整數(shù)、零或正整數(shù) |
equals(Object x) |
檢查此BigDecimal是否與指定對象相等 |
toString() |
將此BigDecimal轉(zhuǎn)化為String |
下面是一個示例程序,演示了如何使用BigDecimal類中的各個方法:
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
public static void main(String[] args) {
// 創(chuàng)建BigDecimal實(shí)例
BigDecimal num1 = new BigDecimal("10.50");
BigDecimal num2 = new BigDecimal("5.25");
// add(BigDecimal augend)
BigDecimal sum = num1.add(num2); // 將num1與num2相加
System.out.println("Sum: " + sum);
// subtract(BigDecimal subtrahend)
BigDecimal difference = num1.subtract(num2); // 從num1中減去num2
System.out.println("Difference: " + difference);
// multiply(BigDecimal multiplicand)
BigDecimal product = num1.multiply(num2); // 將num1與num2相乘
System.out.println("Product: " + product);
// divide(BigDecimal divisor)
BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP); // 將num1除以num2(結(jié)果保留兩位小數(shù))
System.out.println("Quotient: " + quotient);
// remainder(BigDecimal divisor)
BigDecimal remainder = num1.remainder(num2); // 返回num1除以num2的余數(shù)
System.out.println("Remainder: " + remainder);
// pow(int n)
BigDecimal power = num1.pow(3); // 計(jì)算num1的3次冪
System.out.println("Power: " + power);
// setScale(int newScale, RoundingMode roundingMode)
BigDecimal scaledNum = num1.setScale(2, RoundingMode.HALF_UP); // 將num1的小數(shù)位數(shù)設(shè)置為2并進(jìn)行四舍五入
System.out.println("Scaled number: " + scaledNum);
// abs()
BigDecimal absoluteValue = num1.abs(); // 獲取num1的絕對值
System.out.println("Absolute value: " + absoluteValue);
// negate()
BigDecimal negatedValue = num1.negate(); // 獲取num1的相反數(shù)
System.out.println("Negated value: " + negatedValue);
// compareTo(BigDecimal val)
int comparisonResult = num1.compareTo(num2); // 比較num1和num2的大小關(guān)系
if (comparisonResult == 0) {
System.out.println("Both numbers are equal");
} else if (comparisonResult < 0) {
System.out.println("Number 1 is less than Number 2");
} else {
System.out.println("Number 1 is greater than Number 2");
}
// equals(Object x)
boolean isEqual = num1.equals(num2); // 檢查num1是否與num2相等
System.out.println("Is equal? " + isEqual);
// toString()
String stringValue = num1.toString(); // 將BigDecimal轉(zhuǎn)換為String
System.out.println("String value: " + stringValue);
}
}
這個示例程序演示了如何使用BigDecimal
類中的各個方法。它包括創(chuàng)建BigDecimal
實(shí)例、加法、減法、乘法、除法、取余、冪、精度設(shè)置、絕對值、相反數(shù)、比較大小、檢查相等性以及轉(zhuǎn)換為字符串等操作。BigDecimal
類提供了更精確和可靠的數(shù)值計(jì)算功能,適用于需要處理大數(shù)值或進(jìn)行高精度計(jì)算的場景。
運(yùn)行結(jié)果如下:
Sum: 15.75
Difference: 5.25
Product: 55.1250
Quotient: 2.00
Remainder: 0.00
Power: 1157.625000
Scaled number: 10.50
Absolute value: 10.50
Negated value: -10.50
Number 1 is greater than Number 2
Is equal? false
String value: 10.50
3.4 Random類
Random
類用于生成隨機(jī)數(shù)。它提供了多個生成隨機(jī)整數(shù)、浮點(diǎn)數(shù)和字節(jié)數(shù)組的方法。種子是控制隨機(jī)數(shù)序列的起始點(diǎn),可以通過 setSeed(long seed)
方法設(shè)置。使用Random
類可以生成不同范圍內(nèi)的隨機(jī)整數(shù)和浮點(diǎn)數(shù),并進(jìn)行隨機(jī)選擇。它在各種需要隨機(jī)性的應(yīng)用中很有用,如游戲、模擬和密碼學(xué)等領(lǐng)域。
下面是Java的Random類中的全部操作方法API的匯總介紹:
方法 | 描述 |
---|---|
nextInt() |
返回一個隨機(jī)的int類型整數(shù) |
nextInt(int origin, int bound) |
返回一個介于origin(包括)和bound(不包括)之間的int類型整數(shù) |
nextDouble() |
返回一個隨機(jī)的double類型浮點(diǎn)數(shù) |
nextBytes(byte[] bytes) |
生成隨機(jī)的字節(jié)數(shù)組并將其放入指定的字節(jié)數(shù)組中 |
setSeed(long seed) |
設(shè)置此Random對象的種子 |
下面是一個示例程序,演示了如何使用Random類中的各個方法:
import java.util.Random;
import java.util.Arrays;
public class RandomExample {
public static void main(String[] args) {
// 創(chuàng)建Random實(shí)例
Random random = new Random();
// nextInt()
int randomNumber = random.nextInt(); // 生成一個隨機(jī)的int類型整數(shù)
System.out.println("Random number: " + randomNumber);
// nextInt(int origin, int bound)
int rangeNumber = random.nextInt(10); // 生成一個介于0(包括)和10(不包括)之間的int類型整數(shù)
System.out.println("Range number: " + rangeNumber);
// nextDouble()
double randomDouble = random.nextDouble(); // 生成一個隨機(jī)的double類型浮點(diǎn)數(shù)
System.out.println("Random double: " + randomDouble);
// nextBytes(byte[] bytes)
byte[] byteArray = new byte[5];
random.nextBytes(byteArray); // 生成隨機(jī)的字節(jié)數(shù)組并將其放入指定的字節(jié)數(shù)組中
System.out.println("Random bytes: " + Arrays.toString(byteArray));
// setSeed(long seed)
random.setSeed(12L); // 設(shè)置Random對象的種子為12L
long seededRandom1 = random.nextLong(); // 使用種子生成一個隨機(jī)的long類型整數(shù)
System.out.println("Seeded random1: " + seededRandom1);
random.setSeed(12L);
long seededRandom2 = random.nextLong(); // 使用種子生成一個隨機(jī)的long類型整數(shù)
System.out.println("Seeded random2: " + seededRandom2);
}
}
這個示例程序演示了如何使用Random
類中的各個方法。它包括創(chuàng)建Random
實(shí)例、生成隨機(jī)整數(shù)、生成指定范圍內(nèi)的隨機(jī)整數(shù)、生成隨機(jī)浮點(diǎn)數(shù)、生成隨機(jī)字節(jié)數(shù)組以及設(shè)置種子等操作。Random
類提供了生成偽隨機(jī)數(shù)的能力,可以在需要隨機(jī)性的場景中使用,如游戲、模擬和密碼學(xué)等。
運(yùn)行結(jié)果如下:
Random number: -1803381675
Range number: 1
Random double: 0.8991983917654687
Random bytes: [103, -55, -4, -16, 122]
Seeded random1: -4982598272866526024
Seeded random2: -4982598272866526024
?? 如何理解
setSeed(long seed)
方法,種子(seed)是什么?
在計(jì)算機(jī)編程中,Random
類用于生成偽隨機(jī)數(shù)。為了生成隨機(jī)數(shù),Random
對象需要一個起始點(diǎn),這個起始點(diǎn)就是種子(seed
)。種子是一個初始值,它作為隨機(jī)數(shù)生成算法的輸入,并決定了生成的隨機(jī)數(shù)序列。Random
對象使用確定性算法根據(jù)種子(seed
)生成隨機(jī)數(shù)。當(dāng)傳入相同的種子,Random
對象將產(chǎn)生相同的隨機(jī)數(shù)序列。這意味著如果設(shè)置了相同的種子,那么每次調(diào)用生成隨機(jī)數(shù)的方法時都會得到相同的預(yù)測性結(jié)果。
通過設(shè)置不同的種子(seed
),我們可以獲得不同的隨機(jī)數(shù)序列。通常情況下,我們可以使用當(dāng)前時間作為種子值,以確保每次程序執(zhí)行時都會生成不同的隨機(jī)數(shù)序列。但有時候,我們希望具有可重現(xiàn)性,即使在不同的執(zhí)行環(huán)境中也可以生成相同的隨機(jī)數(shù)序列,這時可以手動設(shè)置種子為特定的值。
總結(jié)來說,種子(seed
)是Random
對象生成隨機(jī)數(shù)的起始點(diǎn),不同的種子會生成不同的隨機(jī)數(shù)序列。
3.5 DecimalFormat類
DecimalFormat
類中的操作方法可以幫助我們自定義數(shù)字格式,并進(jìn)行數(shù)字格式化操作,如設(shè)置小數(shù)位數(shù)、設(shè)置前綴和后綴符號以及設(shè)置取整模式等。
下表是Java的DecimalFormat類的全部操作方法API:
方法簽名 | 描述 |
---|---|
DecimalFormat() |
創(chuàng)建一個DecimalFormat對象,默認(rèn)使用的格式樣式與默認(rèn)語言環(huán)境相關(guān) |
DecimalFormat(String pattern) |
用給定的模式創(chuàng)建一個DecimalFormat對象 |
applyLocalizedPattern(String pattern) |
根據(jù)本地化約定將給定的模式應(yīng)用于格式器 |
applyPattern(String pattern) |
將給定的模式應(yīng)用于格式器 |
format(double number) |
格式化給定的數(shù)字,返回一個字符串結(jié)果 |
getMaximumFractionDigits() |
返回此格式器用于格式化小數(shù)部分的最大位數(shù) |
getMinimumFractionDigits() |
返回此格式器用于格式化小數(shù)部分的最小位數(shù) |
getNegativePrefix() |
返回負(fù)數(shù)前綴的字符串 |
getNegativeSuffix() |
返回負(fù)數(shù)后綴的字符串 |
getPositivePrefix() |
返回正數(shù)前綴的字符串 |
getPositiveSuffix() |
返回正數(shù)后綴的字符串 |
setMaximumFractionDigits(int newValue) |
設(shè)置此格式器用于格式化小數(shù)部分的最大位數(shù) |
setMinimumFractionDigits(int newValue) |
設(shè)置此格式器用于格式化小數(shù)部分的最小位數(shù) |
setNegativePrefix(String newValue) |
設(shè)置負(fù)數(shù)前綴的字符串 |
setNegativeSuffix(String newValue) |
設(shè)置負(fù)數(shù)后綴的字符串 |
setPositivePrefix(String newValue) |
設(shè)置正數(shù)前綴的字符串 |
setPositiveSuffix(String newValue) |
設(shè)置正數(shù)后綴的字符串 |
setRoundingMode(RoundingMode mode) |
設(shè)置四舍五入模式 |
下面是一個示例程序,演示如何使用上述每個DecimalFormat類的方法:
import java.text.DecimalFormat;
import java.math.RoundingMode;
public class DecimalFormatExample {
public static void main(String[] args) {
double number = 12345.12345678;
// 創(chuàng)建一個DecimalFormat對象,默認(rèn)使用的格式樣式與默認(rèn)語言環(huán)境相關(guān)
DecimalFormat df1 = new DecimalFormat();
System.out.println(df1.format(number));
// 用給定的模式創(chuàng)建一個DecimalFormat對象
DecimalFormat df2 = new DecimalFormat("#,###.00");
System.out.println(df2.format(number));
// 將給定的模式應(yīng)用于格式器
df1.applyPattern("0.##");
System.out.println(df1.format(number));
// 根據(jù)本地化約定將給定的模式應(yīng)用于格式器
df2.applyLocalizedPattern("#.###");
System.out.println(df2.format(number));
// 設(shè)置此格式器用于格式化小數(shù)部分的最大位數(shù)
int maxFractionDigits = 5;
df1.setMaximumFractionDigits(maxFractionDigits);
System.out.println(df1.format(number));
// 設(shè)置此格式器用于格式化小數(shù)部分的最小位數(shù)
double tempNumber = 666;
int minFractionDigits = 1;
df2.setMinimumFractionDigits(minFractionDigits);
System.out.println(df2.format(tempNumber));
// 返回此格式器用于格式化小數(shù)部分的最大位數(shù)
int maxDigits1 = df1.getMaximumFractionDigits();
System.out.println("Maximum fraction digits for df1: " + maxDigits1);
// 返回此格式器用于格式化小數(shù)部分的最小位數(shù)
int minDigits2 = df2.getMinimumFractionDigits();
System.out.println("Minimum fraction digits for df2: " + minDigits2);
// 設(shè)置負(fù)數(shù)前綴的字符串
df1.setNegativePrefix("(-)");
// 設(shè)置負(fù)數(shù)后綴的字符串
df1.setNegativeSuffix(" NEGATIVE");
// 設(shè)置正數(shù)前綴的字符串
df1.setPositivePrefix("+");
// 設(shè)置正數(shù)后綴的字符串
df1.setPositiveSuffix(" POSITIVE");
// 設(shè)置四舍五入模式
df1.setRoundingMode(RoundingMode.HALF_UP);
// 格式化給定的數(shù)字,返回一個字符串結(jié)果
String formattedNumber1 = df1.format(number);
number = -1234.123456;
String formattedNumber2 = df1.format(number);
System.out.println("Formatted number using df1: " + formattedNumber1);
System.out.println("Formatted number using df1: " + formattedNumber2);
}
}
程序運(yùn)行結(jié)果如下:
12,345.123
12,345.12
12345.12
12345.123
12345.12346
666.0
Maximum fraction digits for df1: 5
Minimum fraction digits for df2: 1
Formatted number using df1: +12345.12346 POSITIVE
Formatted number using df1: (-)1234.12346 NEGATIVE
4?? 應(yīng)用場景
Java 的數(shù)學(xué)計(jì)算相關(guān)類可廣泛應(yīng)用于各種場景,包括但不限于:
- 科學(xué)計(jì)算和統(tǒng)計(jì)分析;
- 金融領(lǐng)域的復(fù)雜計(jì)算(如貨幣交易、稅務(wù)計(jì)算);
- 游戲開發(fā)中的碰撞檢測、物理模擬等;
- 圖像處理中的幾何變換、濾波等。
注意:
使用時注意需要結(jié)合具體業(yè)務(wù)場景要求選擇合適的精度和運(yùn)算方式,避免精度丟失和錯誤結(jié)果。
當(dāng)涉及處理精確貨幣計(jì)算時,務(wù)必使用 BigDecimal
類以避免舍入誤差。
5?? 使用技巧
-
BigDecimal
類BigDecimal
類用于進(jìn)行高精度的數(shù)學(xué)計(jì)算,提供了精確的數(shù)字操作。它適用于需要精確計(jì)算、處理貨幣等涉及小數(shù)位數(shù)較多或要求高精度的場景。使用技巧:- 創(chuàng)建
BigDecimal
對象時,可以使用字符串或基本數(shù)據(jù)類型作為參數(shù)傳入構(gòu)造函數(shù)。避免使用雙精度浮點(diǎn)數(shù)或浮點(diǎn)字面值來創(chuàng)建對象,以免精度丟失; - 使用
BigDecimal
的方法執(zhí)行數(shù)學(xué)運(yùn)算時,例如add
、subtract
等。注意使用對應(yīng)的方法進(jìn)行除法運(yùn)算時,指定精確的舍入規(guī)則(RoundingMode
); - 避免使用
doubleValue
方法將對象轉(zhuǎn)換為雙精度浮點(diǎn)數(shù),因?yàn)檫@可能導(dǎo)致精度損失。盡量保持結(jié)果在BigDecimal
類型中進(jìn)行處理。
- 創(chuàng)建
-
Math
類
Math類提供了很多數(shù)學(xué)計(jì)算相關(guān)的靜態(tài)方法,可用于執(zhí)行各種數(shù)學(xué)計(jì)算操作。使用技巧:- 盡量避免多次調(diào)用
Math
類中的復(fù)雜計(jì)算方法,因?yàn)槠涞讓涌赡軙?zhí)行較慢。如果需要重復(fù)使用某個計(jì)算結(jié)果,可以將其保存在變量中,避免重復(fù)計(jì)算; - 注意
Math
類中的一些常量(如PI和E),可以通過靜態(tài)字段直接訪問,避免重復(fù)計(jì)算或調(diào)用一個方法來獲取常量的值。
- 盡量避免多次調(diào)用
-
Random
類Random
類用于生成偽隨機(jī)數(shù)。使用技巧:- 想要生成特定范圍內(nèi)的隨機(jī)數(shù),使用
nextInt
、nextDouble
等方法,并根據(jù)需要進(jìn)行線性變換或縮放操作; - 盡量避免在頻繁循環(huán)或大量生成隨機(jī)數(shù)的場景中創(chuàng)建新的對象??梢詫ο舐暶鳛槿肿兞浚员愣啻问褂猛粋€對象;
- 在創(chuàng)建
Random
對象時,建議將種子(seed
)設(shè)置為當(dāng)前時間的毫秒數(shù),以獲得較好的隨機(jī)性。
- 想要生成特定范圍內(nèi)的隨機(jī)數(shù),使用
-
DecimalFormat
類DecimalFormat
類用于格式化數(shù)字。通過指定模式(pattern
)和相關(guān)設(shè)置,可以自定義數(shù)字的顯示方式,包括小數(shù)位數(shù)、千分位分隔符、前綴后綴等。使用技巧:- 對于重復(fù)使用相同模式的情況,避免每次都重新創(chuàng)建
DecimalFormat
對象。建議將對象聲明為靜態(tài)變量,以便多次重用; - 注意設(shè)置適當(dāng)?shù)纳崛肽J?
RoundingMode
)來控制格式化后的數(shù)字舍入規(guī)則,以滿足需要的精確度和準(zhǔn)確性要求。
- 對于重復(fù)使用相同模式的情況,避免每次都重新創(chuàng)建
以上是關(guān)于幾個常用的Java數(shù)學(xué)計(jì)算類庫的基本使用和一些優(yōu)化技巧。根據(jù)具體的需求和情境,可以進(jìn)一步了解它們的詳細(xì)功能和更多用法,并根據(jù)實(shí)際情況進(jìn)行調(diào)整和優(yōu)化代碼。
?? 總結(jié)
Java 的數(shù)學(xué)計(jì)算相關(guān)類提供了強(qiáng)大的數(shù)學(xué)運(yùn)算和操作功能。開發(fā)人員可以根據(jù)實(shí)際需求,選擇適當(dāng)?shù)念悂韴?zhí)行簡單或高精度的數(shù)學(xué)計(jì)算。但在使用過程中,需要注意選擇合適的精度、性能優(yōu)化和避免誤差等問題。通過熟悉這些類的特性與用法,并靈活運(yùn)用,我們能夠更好地利用 Java 提供的數(shù)學(xué)計(jì)算能力解決實(shí)際問題。
?? 本文源碼下載地址
Java的數(shù)學(xué)運(yùn)算處理類講解代碼(BigDecimal、Math、Random、DecimalFormat類全部操作方法API)
《【Java基礎(chǔ)教程】(三十五)常用類庫篇 · 第五講:System類——解析系統(tǒng)輔助工具System類,一個系統(tǒng)操作與資源管理工具類 ~》
《【Java基礎(chǔ)教程】(三十七)常用類庫篇 · 第七講:日期時間處理類——三萬字全面講解 LocalDateTime和 DateTimeFormatter,Date、Calendar ~》

到了這里,關(guān)于【Java基礎(chǔ)教程】(三十六)常用類庫篇 · 第六講:數(shù)學(xué)運(yùn)算類——全面講解Java數(shù)學(xué)計(jì)算支持類庫,BigDecimal、Math、Random、DecimalFormat...~的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!