JavaSE基础篇【4】
2022年6月9日
第七部分 数字处理类
7.1 数字格式化
数字格式化操作主要针对的是浮点型数据,包括 double 型和 float 型数据。在 Java 中使用 java.text.DecimalFormat 格式化数字。在 Java 中没有格式化的数据遵循以下原则:
由于上述输出格式不能满足解决实际问题的要求,通常将结果格式化为指定形式后输出。在 Java 中可以使用 DecimalFormat 类进行格式化操作。
DecimalFormat 是 NumberFormat 的一个子类,用于格式化十进制数字。它可以将一些数字格式化为整数、浮点数、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一般情况下可以在实例化 DecimalFormat 对象时传递数字格式,也可以通过 DecimalFormat 类中的 applyPattern( ) 方法来实现数字格式化。
当数字格式化时,在 DecimalFormat 类中使用一些特殊字符构成一个格式化模板,使数字按照一定的特殊字符规则进行匹配。
字符 | 说明 |
0 | 代表阿拉伯数字,使用特殊字符 “ 0 ” 表示数字的一位阿拉伯数字,如果该位不存在数字,则显示 0 |
# | 代表阿拉伯数字,使用特殊字符 “ # ” 表示数字的一位阿拉伯数字,如果该位存在数字,则显示字符;如果该位不存在数字,则不显示 |
. | 小数分隔符或货币小数分隔符 |
- | 负号 |
, | 分组分隔符 |
E | 分割科学记数法中的尾数和指数 |
% | 本符号放置在数字的前缀或后缀,将数字乘以 100 显示位百分位 |
\u2030 | 本符号放置在数字的前缀或后缀,将数字乘以 1000 显示位千分位 |
\u00A4 | 本符号放置在数字的前缀或后缀,作为货币记号 |
’ | 本符号位单引号,当上述字符出现在数字中时,应位特殊符号添加单引号,系统会将此符号视为普通符号处理 |
在 DecimalFormat 类中除了可以通过格式化模板来格式化数字之外,还可以使用一些特殊方法对数字进行格式化设置。例如:
DecimalFormat myFormat=new DecimalFormat( )
myFormat.setGroupingSize(2) //设置将数字分组的大小
myFormat.setGroupingUsed(false) //设置是否支持分组import java.text.DecimalFormat;
public class DecimalMethod{
public static void main(String[] args){
DecimalFormat myFormat = new DecimalFormat();
myFormat.setGroupingSize(2);
String output = myFormat.format(123456.789);
System.out.println("将数字以每两个数字分组:"+output);
myFormat.setGroupingUsed(false);
String output2 = myFormat.format(123456.789);
System.out.println("不允许数字分组:"+output2);
}
}
7.2 数学运算
在 Java 语言中提供了一个执行数学基本运算的 Math 类,该类包括常用的数学运算方法,以及一些常用的数学常量。
- 1. Math 类
在 Math 类中提供了众多的数学方法,主要包括三角函数方法、指数函数方法、取整函数方法、取最大值、最小值以及平均值函数方法。这些方法都被定义为 static 形式,所以在程序中应用比较简便。可以用如下形式调用。
Math.数学方法
在 Math 类中除了函数方法之外还存在一些常用数学变量,如 PI、E等。这些数学变量作为 Math 类的成员变量出现,调用起来比较简单,可用如下的形式调用:
Math.PI
Math.E
- 2. 常用数学运算方法
在 Math 类中的常用数学运算方法比较多,大致可以分为 4 大类别,分别为三角函数方法、指数函数方法、取整函数方法以及取最大值、最小值和绝对值函数方法。
- 三角函数方法
在 Math 类中包含的三角函数方法如下。
以上每个方法的参数和返回值都是 double 型的(因其会用 Π 来表示)。但需要注意的是,角度与弧度的相互转换通常是不精确的。
- 指数函数方法
Math 类中与指数函数相关的方法主要如下。
- public static double exp(double a) 用于获取 e 的 a 次方,即取 ea
- public static double pow(double a, double b) 用于取 a 的 b 次方,即 ab
public class Function{
public static void main(String[] args){
System.out.println("90°的正弦值为:"+Math.sin(Math.PI/2));
System.out.println("e 的平方值为:"+Math.exp(2));
}
}
- 取整函数方法
在 Math 类中主要包括以下几种取整方法。 - 取最大值、最小值、绝对值函数方法
在 Math 类中包含这些操作的方法如下。
7.3 随机数
在实际开发中,随机数的使用是很普遍的。在 Java 中主要提供了两种生成随机数的方式,分别为调用 Math 类的 random( ) 方法生成随机数和调用 Random 类生成各种数据类型的随机数。
- 1. Math.random( ) 方法
在 Math 类中存在一个 random( ) 方法,用于产生随机数。这个方法默认生成大于等于 0.0 且小于 1.0 的 double 型随机数,即 0<=Math.random( )<1.0。虽然 Math.random( ) 方法只可以产生 0~1 之间的 double 型数字,但只要在 Math.random( ) 语句上稍加处理,就可以使用这个方法产生任意范围的随机数。
(int)(Math.Random()*n) 返回大于等于 0 且小于 n 的随机数
m+(int)(Math.Random()*n) 返回大于等于 m 且小于 m+n 的随机数
public class MathRandom{
/**
* 定义产生偶数的方法
* @param num1 起始参数范围
* @param num2 终止参数范围
* @return 随机的范围内偶数
*/
public static int GetEvenNum(double num1, double num2){
//产生num1~num2之间的随机数
int s= (int)num1+(int)(Math.random()*(num2-num1));
if(s%2==0){ //判断随机数是否为偶数
return s; //若是,则返回s
}else
return s+1; //若不是,则返回s+1
}
public static void main(String[] args){
//调用产生随机数方法
System.out.println("任意一个2~32之间的偶数:"+GetEvenNum(2,32));
}
}
使用 Math 类的 random( ) 方法也可以随机生成字符,可以使用以下代码生成 a~z 之间的字符。
(char)(‘a’+Math.random()*(‘z’-‘a’+1))
通过上述表达式可以求出更多的随机字符,如 A~Z 之间的随机字符。进而推理出,若想生成任意两个字符之间的随机字符,可以使用以下语句实现:
(char)(cha1+Math.random()*(cha2-cha1+1))
- 2. Random 类
除了 Math 类中的 random( ) 方法可以获取随机数之外,Java 中还提供了一种可以获取随机数的方式,那就是 java.util.Random 类。通过实例化一个 Random 对象可以创建一个随机数生成器。
语法如下:
Random r = new Random();
其中,r 指的是 Random 对象。
以这种方式实例化对象时,Java 编译器将以系统当前时间作为随机数生成器的种子。因为每时每刻的时间不可能相同,所以产生的随机数不同。但是如果运行速度太快,也会产生两次运行结果相同的随机数。用户也可以在实例化 Random 对象时,设置随机数生成器的种子 seedValue。
语法如下:
Random r = new Random(seedValue);
在 Random 类中提供了获取各种数据类型随机数的方法,分别如下:
import java.util.Random;
public class RandomDemo{
public class void main(String[] args){
Random r = new Random(); //实例化一个Random类
System.out.prinln("随机产生一个整数:"+r.nextInt());
System.out.println("随机产生一个大于等于0且小于10的整数:"+r.nextInt(10));
}
}
7.4 大数字运算
在 Java 中提供了大数字的操作类,即 java.math.BigInteger 类与 java.math.BigDecimal 类。这两个类用于高精度计算,其中 BigInteger 类是针对大整数的处理类,而 BigDecimal 类是针对大小数的处理类。
- 1. BigInteger 类
Biglnteger 类型的数宇范围较 Integer 类型的数字范围要大得多。前文介绍过 Integser 是 int 的包装类,int 的最大值为 231-1,如果要计算更大的数字,使用 Integer 数据类型就无法实现了,所以 Java 中提供了 BigInteger 类来处理更大的数字。BigInteger 支持任意精度的整数,也就是说,在运算中 Biglnteger 类型可以准确地表示任何大小的整数值而不会丟失信息。
在 Biglnteger 类中封装了多种操作,除了基本的加、滅、乘、除操作之外,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
使用 Biglnteger 类,可以实例化一个BigInteger 对象,并自动调用相应的构造函数。Biglnteger 类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数宇。
语法如下:
public BigInteger(String val)
其中,val 是十进制字符串。
如果将 2 转换为 BigInteger 类型,可以使用以下语句进行初始化操作:
BigInteger twoInstance = new BigInteger(“2”);
一旦创建了对象实例,就可以调用 Biglnteger 类中的一些力法进行运算操作,包括基本的数学运算和位运算以及一些取相反数、取绝对值等操作。下面列举了 Biglnteger 类中常用的几种运算方法。
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInstance = new BigInteger("4");//实例化一个大数字
//取该大数字加2操作
System.out.println("加法操作:"+bigInstance.add(new BigInteger("2")));
}
}
- 2. BigDecimal 类
BigDecimal 和 BigInteger 都能实现大数字的运算。不同的是 BigDecimal 加入了小数的概念。一般的 float 型和 double 型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到 java.math.BigDecimal 类。BigDecimal 类支持任何精度的定点数,可以用它来精确计算货比值。
在 BigDecimal 类中有两个构造方法。
- public BigDecimal(double val):实例化时将双精度型转换为 BigDecimal 类型
- public BigDecimal(String val):实例化时将字符串形式转换为 BigDecimal 类型
BigDecimal 类型的数字可以用来做超大浮点数的运算,如加、减、乘、除等。在所有的运算中,除法是最复杂的,因为在除不尽的情况下末位小数点的处理是需要考虑的。
下面列举了 BigDecimal 类中的这些方法。
BigDecimal 类中的 divide( ) 方法的多种处理模式主要有:
模式 | 含义 |
BigDecimal.ROUND_UP | 商的最后一位如果大于0,则向前进位,正负数都如此 |
BigDecimal.ROUND_DOWN | 商的最后一位无论是什么数字,都省略 |
BigDecimal.ROUND_CEILING | 商如果是整数,按照 ROUND_UP 模式处理;如果是负数,按照 ROUND_DOWN 模式处理。这两种处理模式都是使得近似值大于等于实际值 |
BigDecimal.ROUND_FLOOR | 与 ROUND_CEILING 模式相反,此外会使得近似值小于等于实际值 |
BigDecimal.ROUND_HALF_DOWN | 对商进行四舍五入操作,如果最后一位小于等于5,则做舍弃操作;如果最后一位大于5,则做进位操作 |
BigDecimal.ROUND_HALF_UP | 对商进行四舍五入操作,如果商的最后一位小于5,则舍弃;如果大于等于5,则进行进位操作 |
BigDecimal.ROUND_HALF_EVEV | 如果商的倒数第二位为奇数,则按照 ROUND_HALF_UP 处理;若为偶数,则按照 ROUND_HALF_DOWN 处理 |
import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location = 10;
/**
* 定义加法方法,参数为加数与被加数
*
* @param value1
* 相加的第一个数
* @param value2
* 相加的第二个数
* @return 两数之和
*/
public BigDecimal add(double value1,double value2) {
//实例化Decimal对象
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2);//调用加法方法
}
/**
* 定义减法方法,参数为减数和被减数
*
* @param value1 被减数
* @param value2 减数
* @return 运算结果
*/
public BigDecimal sub(double value1,double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2);//调用减法方法
}
/**
* 定义乘法方法,参数为乘数和被乘数
*
* @param value1 第一个乘数
* @param value2 第二个乘数
* @return 运算结果
*/
public BigDecimal mul(double value1,double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2);//调用乘法方法
}
/**
* 定义除法方法,参数为除数和被除数
*
* @param value1 被除数
* @param value2 除数
* @return 运算结果
*/
public BigDecimal div(double value1,double value2) {
return div(value1,value2,location);//调用自定义除法方法
}
//定义除法方法,参数分别为除数与被除数以及商小数点后的位数
public BigDecimal div(double value1,double value2,int b) {
if(b<0) {
System.out.println("b值必须大于等于0");
}
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用除法方法,商小数点后保留b位,并将结果进行四舍五入操作
return b1.divide(b2,b,BigDecimal.ROUND_HALF_UP);
}
public static void main(String[] args) {
BigDecimalDemo b = new BigDecimalDemo();
System.out.println("两个数字相加的结果为:"+b.add(-7.5, 8.9));
System.out.println("两个数字相减的结果为:"+b.sub(-7.5, 8.9));
System.out.println("两个数字相乘的结果为:"+b.mul(-7.5, 8.9));
System.out.println("两个数字相除,结果小数后保留10位为:"+b.div(10, 2));
System.out.println("两个数字相除,结果保留小数后5位为:"+b.div(-7.5,8.9,5));
}
}
在 Eclipse 中运行本实例,运行结果如图所示。