数字处理类
1、前言
在解决实际问题的时候,对数字的处理非常普遍。比如数学问题、随机问题、商业货币问题、科学计算问题等。Java中提供了处理相关问题的类,如用于格式化数字的DecimalFormat类,数学计算相关的Math类,随机数相关的Random类,大数字处理相关的BigInteger类和BigDecimal类。以下分别对这些类作一些简单的介绍。
2、Math类
Math类是Java提供的执行数学基本运算的类,api文档中说明如下:
注意Math类是final修饰的最终类,不可被继承。
Math类提供的成员属性如下:
提供的方法如下:
以下对常用的方法进行说明。
2.1、三角函数方法
- sin(double a):返回角的正弦值。
- cos(double a):返回角的余弦值。
- tan(double a):返回角的正切值。
- asin(double a):返回值的反正弦。
- acos(double a):返回值的反余弦。
- atan(double a):返回值的反正切。
- toRadians(double a):角度转换为弧度。
- toDegress(double a):弧度转换为角度。
以下用例子说明:
public static void main(String[] args) {
System.out.println("π=" + Math.PI);
System.out.println("e=" + Math.E);
System.out.println("90°的正弦值:" + Math.sin(Math.PI / 2));
System.out.println("180°的余弦值:" + Math.cos(Math.PI));
System.out.println("45°的正切值:" + Math.tan(Math.PI / 4));
System.out.println("1.0的反正弦:" + Math.asin(1.0));
System.out.println("-1.0的反余弦:" + Math.acos(-1.0));
System.out.println("1.0的反正切:" + Math.atan(1.0));
System.out.println("90°的弧度值:" + Math.toRadians(90.0));
System.out.println("π的角度值:" + Math.toDegrees(Math.PI));
}
执行,控制台:
2.2、指数函数方法
- exp(double a):取e的a次方。
- log(double a):取a的自然对数。
- log10(double 10):取10为底数的对数值。
- sqrt(double a):取a的平方根,a非负数。
- cbrt(double a):取a的立方根。
- pow(double a,double b):取a的b次方。
以下用代码说明:
public static void main(String[] args) {
System.out.println("e的3次方为:" + Math.exp(3.0));
System.out.println("e的对数为:" + Math.log(Math.E));
System.out.println("以10为底,10的对数为:" + Math.log10(10.0));
System.out.println("4的平方根为:" + Math.sqrt(4.0));
System.out.println("8的立方根为:" + Math.cbrt(8.0));
System.out.println("2的5次方为:" + Math.pow(2, 5.0));
}
执行,控制台:
2.3、取整函数方法
- ceil(double a):返回大于等于a的最小整数。
- floor(double a):返回小于等于a的最大整数。
- rint(double a):返回与a最接近的整数,如果两个整数同样接近,取偶数,比如2.5,那么会取2而不是3。
- round(a):a可以是float类型,也可以是double类型,此方法是四舍五入。
以下代码说明:
public static void main(String[] args) {
System.out.println("大于等于5.7的最小整数:" + Math.ceil(5.7));
System.out.println("小于等于5.7的最大整数:" + Math.floor(5.7));
System.out.println("与5.7最接近的整数:" + Math.rint(5.7));
System.out.println("与5.5最接近的整数:" + Math.rint(5.5));
System.out.println("5.4的四舍五入值:" + Math.round(5.4));
System.out.println("5.5的四舍五入值:" + Math.round(5.5));
}
执行,控制台:
2.4、最大值、最小值、绝对值、随机数方法
- max(a,b):返回较大值。a和b同类型,可以是int、long、float、double类型的。
- min(a,b):返回较小值。a和b同类型,可以是int、long、float、double类型的。
- abs(a):返回a的绝对值。a可以是int、long、float、double类型的。
- random():返回一个区间在[0.0,1.0]的随机数。
public static void main(String[] args) {
int a = 20;
int b = 25;
System.out.println("较大值为:" + Math.max(a, b));
System.out.println("较小值为:" + Math.min(a, b));
System.out.println("20的绝对值为:" + Math.abs(20));
System.out.println("0的绝对值为:" + Math.abs(0));
System.out.println("-20的绝对值为:" + Math.abs(-20));
System.out.println("随机产生一个在0到1之间的数:" + Math.random());
System.out.println("随机产生一个在0到1之间的数:" + Math.random());
System.out.println("随机产生一个在0到1之间的数:" + Math.random());
}
注意:每次产生的随机数一定是不同的。
以两个例子熟悉一下:
找出4个数a、b、c、d中的最大值和最小值。
public static void main(String[] args) {
int a = 25, b = 20, c = 18,d = 27;
int max = Math.max(Math.max(Math.max(a, b), c), d);
int min = Math.min(Math.min(Math.min(a, b), c), d);
System.out.println("4个数中的最大数是" + max + ",最小数是" + min);
}
控制台:
用数组的话简单很多:
public static void main(String[] args) {
int[] arr = new int[] {25, 20, 18, 27 };
Arrays.sort(arr);
System.out.println("最大数是" + arr[arr.length - 1] + ",最小数是" + arr[0]);
}
随机产生一个10到20之间的整数。
public static void main(String[] args) {
for (int i = 1; i < 11; i++) {
double d = Math.random();
int res = (int) Math.round((d * 10));
int random = 10 + res;
System.out.println("第" + i + "次产生的随机数为:" + random);
}
}
控制台:
可以看到满足要求,并且两端可以取到。
3、DecimalFormat类
数字格式化在实际问题中非常常见,比如超市的商品价格,需要保留2位有效数字。Java中只对浮点类型进行数字格式化操作,使用DecimalFormat类来格式化数字。
api文档说明如下:
特殊字符说明如下:
提供的方法如下:
以下用代码说明:
public static void main(String[] args) {
double price = 14342342543.423;
System.out.println("未格式化之前:" + price);
System.out.println("格式化之后:" + SimpleFormat("###,###.###", price));
System.out.println("格式化之后:" + SimpleFormat("###.##", price));
System.out.println("格式化之后:" + SimpleFormat("###,###.###元", price));
System.out.println("0.976转换为百分数是:" + SimpleFormat("#.###%", 0.976));
System.out.println("0.976转换为千分数是:" + SimpleFormat("#.###‰", 0.976));
}
// 定义一个方法,用于格式化数字
private static String SimpleFormat(String pattern, double value) {
// 实例化DecimalFormat对象
DecimalFormat df = new DecimalFormat(pattern);
// 使用format方法格式化
String res = df.format(value);
return res;
}
控制台:
public static void main(String[] args) {
DecimalFormat df = new DecimalFormat();
//数字分组
df.setGroupingSize(2);
System.out.println("数字每两个进行分组:" + df.format(471235229.432));
//关闭数字分组
df.setGroupingUsed(false);
System.out.println("数字每两个进行分组:" + df.format(471235229.432));
//开启数字分组
df.setGroupingUsed(true);
System.out.println("数字每两个进行分组:" + df.format(471235229.432));
}
控制台:
默认是开启分组的,也就是为true的。
4、Random随机类
在实际开发中,随机数的使用是很常见的,有必要掌握在程序中产生随机数。在Java中提供了两种方式来产生随机数,Math类的random方法,还有使用Random类提供的各种方法来产生随机数。
4.1、Math类的random方法产生随机数
产生10个0到15的随机数,产生5个15到20的随机数。
public static void main(String[] args) {
System.out.println("以下随机产生10个0到15之间的数:");
for (int i = 1; i < 11; i++) {
System.out.println("产生的第" + i + "个随机数是:" + getRandomFrom0To15());
}
System.out.println("------------------------------");
System.out.println("以下随机产生5个15到20之间的数:");
for (int i = 1; i < 6; i++) {
System.out.println("产生的第" + i + "个随机数是:" + getRandomFrom15To20());
}
}
// 定义一个方法,产生0到15之间的随机数
private static int getRandomFrom0To15() {
double res = Math.random();
int random = (int) (res * 15);
return random;
}
// 定义一个方法,产生15到20之间的随机数
private static int getRandomFrom15To20() {
double res = Math.random();
int random = (int) Math.round(res * (20 - 15));
return random + 15;
}
控制台:
范围正确,两端可以取到,没问题。
随机产生10个a-z的小写字母,10个A-Z的大写字母。
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("产生的第" + i + "个小写字母是:" + getRandomChar('a', 'z'));
}
System.out.println("-----------------------------");
for (int i = 1; i <= 10; i++) {
System.out.println("产生的第" + i + "个大写字母是:" + getRandomChar('A', 'Z'));
}
}
// 定义一个方法,随机产生两个字母之间的任意字母
private static char getRandomChar(char c1, char c2) {
char res = (char) (Math.random() * (c2 - c1 + 1) + c1);
return res;
}
执行,控制台如下:
4.2、Random类产生随机数
这个Random类是Java专门提供用来生成随机数的。api文档中说明如下:
提供的方法如下:
常用的几种方法:
- nextInt():返回一个随机整数。
- nextInt(int n):返回0到n之间的随机整数,不包括n。
- nextLong():返回一个随机long类型值。
- nextFloat():返回一个随机Float类型值。
- nextDouble():返回一个随机Double类型值。
- nextBooean():返回一个随机lBoolean类型值。
- nextGaussian() :返回一个概率密度为高斯分布的双精度值。
以下代码示例:
public static void main(String[] args) {
Random random = new Random();
for (int i = 1; i <= 10; i++) {
// 随机产生一个0到15之间的整数
int res = random.nextInt(16);
System.out.println("产生的第" + i + "个随机数是:" + res);
}
System.out.println("-------------------------------");
for (int i = 1; i <= 5; i++) {
// 随机产生一个15到20之间的整数
int res = random.nextInt(6) + 15;
System.out.println("产生的第" + i + "个随机数是:" + res);
}
}
控制台:
如果要使用随机数的话,推荐还是首选Random类,虽然Math的random方法可以实现同样的效果,但要稍微复杂一些,使用Random类的一些方法非常简单。
5、例子
下面通过两个例子进一步加深对数字处理类的理解。
求圆形的周长和面积,以半径为参数,计算结果保留5位小数。
public class Test {
public static final double PI = Math.PI;
public static final DecimalFormat PATTERN = new DecimalFormat("#.#####");
public static void main(String[] args) {
System.out.println("半径为5的圆形周长为:" + getGirth(5));
System.out.println("半径为5的圆形面积为:" + getArea(5));
}
// 定义一个方法,求圆形周长,保留5位小数
private static double getGirth(double radius) {
double girth = 2 * PI * radius;
String res = PATTERN.format(girth);
return Double.parseDouble(res);
}
// 定义一个方法,求圆形面积,保留5位小数
private static double getArea(double radius) {
double area = PI * Math.pow(radius, 2);
String res = PATTERN.format(area);
return Double.parseDouble(res);
}
}
获取2-32之间的6个偶数,并且求他们的和值。
public static void main(String[] args) {
int sum = 0;
int i = 1;
Random random = new Random();
while (i <= 6) {
int res = 2 + random.nextInt(31);
if (res % 2 == 0) {
System.out.println("产生的第" + i + "个随机偶数是:" + res);
sum += res;
i++;
}
}
System.out.println("和值为:" + sum);
}