在Jakarta Commons中,專門處理數學計算的類分別可以在兩個地方找到:一是Commons Lang的org.apache.commons.lang.math包中,二是在Commons Math這個單獨的子項目中。由于后者主要是處理復數、矩陣等,相對使用比較少,在我的筆記中就只簡單講講Commons Lang中的math包。對后者感興趣的可以看看
http://jakarta.apache.org/commons/math/
org.apache.commons.lang.math包中共有10個類,這些類可以歸納成四組:
1- 處理分數的Fraction類;
2- 處理數值的NumberUtils類;
3- 處理數值范圍的Range、NumberRange、IntRange、LongRange、FloatRange、DoubleRange類;
4- 處理隨機數的JVMRandom和RandomUtils類。
下面我舉個例子分別說明上述四組的使用方法:
package sean.study.jakarta.commons.lang;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.DoubleRange;
import org.apache.commons.lang.math.Fraction;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.commons.lang.math.Range;
public class LangMathUsage {
public static void main(String[] args) {
demoFraction();
demoNumberUtils();
demoNumberRange();
demoRandomUtils();
}
public static void demoFraction() {
System.out.println(StringUtils.center(" demoFraction ", 30, "="));
Fraction myFraction = Fraction.getFraction(144, 90);
// Fraction myFraction = Fraction.getFraction("1 54/90");
System.out.println("144/90 as fraction: " + myFraction);
System.out.println("144/90 to proper: " + myFraction.toProperString());
System.out.println("144/90 as double: " + myFraction.doubleValue());
System.out.println("144/90 reduced: " + myFraction.reduce());
System.out.println("144/90 reduced proper: "
+ myFraction.reduce().toProperString());
System.out.println();
}
public static void demoNumberUtils() {
System.out.println(StringUtils.center(" demoNumberUtils ", 30, "="));
System.out.println("Is 0x3F a number? "
+ StringUtils.capitalize(BooleanUtils.toStringYesNo(NumberUtils
.isNumber("0x3F"))) + ".");
double[] array = { 1.0, 3.4, 0.8, 7.1, 4.6 };
double max = NumberUtils.max(array);
double min = NumberUtils.min(array);
String arrayStr = ArrayUtils.toString(array);
System.out.println("Max of " + arrayStr + " is: " + max);
System.out.println("Min of " + arrayStr + " is: " + min);
System.out.println();
}
public static void demoNumberRange() {
System.out.println(StringUtils.center(" demoNumberRange ", 30, "="));
Range normalScoreRange = new DoubleRange(90, 120);
double score1 = 102.5;
double score2 = 79.9;
System.out.println("Normal score range is: " + normalScoreRange);
System.out.println("Is "
+ score1
+ " a normal score? "
+ StringUtils
.capitalize(BooleanUtils.toStringYesNo(normalScoreRange
.containsDouble(score1))) + ".");
System.out.println("Is "
+ score2
+ " a normal score? "
+ StringUtils
.capitalize(BooleanUtils.toStringYesNo(normalScoreRange
.containsDouble(score2))) + ".");
System.out.println();
}
public static void demoRandomUtils() {
System.out.println(StringUtils.center(" demoRandomUtils ", 30, "="));
for (int i = 0; i < 5; i++) {
System.out.println(RandomUtils.nextInt(100));
}
System.out.println();
}
}
以下是運行結果:
======== demoFraction ========
144/90 as fraction: 144/90
144/90 to proper: 1 54/90
144/90 as double: 1.6
144/90 reduced: 8/5
144/90 reduced proper: 1 3/5
====== demoNumberUtils =======
Is 0x3F a number? Yes.
Max of {1.0,3.4,0.8,7.1,4.6} is: 7.1
Min of {1.0,3.4,0.8,7.1,4.6} is: 0.8
====== demoNumberRange =======
Normal score range is: Range[90.0,120.0]
Is 102.5 a normal score? Yes.
Is 79.9 a normal score? No.
====== demoRandomUtils =======
75
63
40
21
92
以上就是Commons Lang的math包通常的用法。提一下NumberUtils.inNumber(String)方法,它會正確判斷出給定的字符串是否是合法的數值,而我在前面的筆記中提到的StringUtils.isNumeric(String)只能判斷一個字符串是否是由純數字字符組成。Commons Lang的math包的各個類都還有很多實用的方法,遠不止我在例子中用到的這些,如果你感興趣,參照一下Commons Lang的Javadoc吧。