Java基础08—数字类处理
Posted xuliang-daydayup
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础08—数字类处理相关的知识,希望对你有一定的参考价值。
数字处理类
参考资料:《Java从入门到精通》/明日科技编著. 4版. 北京:清华大学出版社,2016
一、数字格式化
数字的格式化在解决实际问题时非常普遍,如超市商品的价格,需要保留两位有效数字。在Java中使用java.text.DecimalFormat类对浮点型数据进行格式化操作,其中浮点型数据包括double型和float型,
- DecimalFormat是numberFormat的一个子类,用于格式化十进制数字,它可以将一些数字格式化为整型、浮点型、百分数等。
- DecimalFormat类可以为要输出的数字加上单位或者控制数字的精度。
- 通过DecimalFormat类中的applyPattern()方法可以实现数字格式化。
import java.text.DecimalFormat;
public class DecimalFormatSimpleDemo {
static public void SimpleFormat(String pattern, double value){
//创建DecimalFormat类对象,并设置格式化模式
DecimalFormat decimalFormat = new DecimalFormat(pattern);
//将传入的参数进行格式化
String output = decimalFormat.format(value);
//打印格式化的结果
System.out.println(value + " " + pattern + " " + output );
}
static public void UseApplyPatternMethodFormat(String pattern, double value){
//创建DecimalFormat类对象
DecimalFormat decimalFormat = new DecimalFormat();
//调用applyPattern()方法设置格式化模式
decimalFormat.applyPattern(pattern);
//将传入的参数进行格式化
String output = decimalFormat.format(value);
//打印格式化的结果
System.out.println(value + " " + pattern + " " + output);
}
public static void main(String[] args) {
//调用SimpleFormat()方法,并传入格式模板以及需要进行格式化的数字
SimpleFormat("###,###.##", 123345.2345);
SimpleFormat("000,000,000.##kg", 12321.234);
//调用UseApplyPatternMethodFormat()方法,并传入格式模板以及需要进行格式化的数字
UseApplyPatternMethodFormat("#.##%", 4.234);
UseApplyPatternMethodFormat("0.00u2030", 0.673);
}
}
输出结果:
123345.2345 ###,###.## 123,345.23
12321.234 000,000,000.##kg 000,012,321.23kg
4.234 #.##% 423.4%
0.673 0.00‰ 673.00‰
上述代码中,第一行使用import关键字将java.text.DecimalFormat这个类包含进来,即告知系统下面的代码将用到DecimalFormat这个类。
在DecimalFormat类中,除了使用格式化模板来格式化数字之外,还可以使用一些特殊的方法对数字进行格式化,如下所示:
import java.text.DecimalFormat;
public class DecimalMethod {
public static void main(String[] args) {
//创建DecimalFormat类对象
DecimalFormat decimalFormat = new DecimalFormat();
//将数字分组设置为2
decimalFormat.setGroupingSize(2);
//对数字进行格式化
String output1 = decimalFormat.format(2344521.123);
//打印输出结果
System.out.println(output1);
//设置不允许数字分组
decimalFormat.setGroupingUsed(false);
//对数字进行格式化
String output2 = decimalFormat.format(3421312.2123);
//打印输出结果
System.out.println(output2);
}
}
输出结果:
2,34,45,21.123
3421312.212
二、数学运算
1、Math类
在Math类中提供了众多数学函数方法,主要包括三角函数、指数函数方法、取整函数方法、取最大值、最小值以及平均值函数方法,这些方法都被定义为static形式,可以直接调用,如下所示:
Math.数学方法
在Math类中除了函数方法之外还存在一些常用数学常量,如PI、E等。可以使用如下形式调用:
Math.PI
Math.E
2、常用的数学方法
在Math类的数学方法大致可以分为4类,如下所示:
- 三角函数方法
- 指数函数方法
- 取整函数方法
- 取最大值、取最小值、取绝对值函数方法
(1)三角函数方法
该方法的参数和返回值都是double型。
public class Trigonometric {
public static void main(String[] args) {
System.out.println("PI的值:" + Math.PI);
System.out.println("90度的正弦值:" + Math.sin(Math.PI/2));
System.out.println("0度的余弦值:" + Math.cos(0));
System.out.println("45度的正切值:" + Math.tan(Math.PI/4));
}
}
输出结果:
PI的值:3.141592653589793
90度的正弦值:1.0
0度的余弦值:1.0
45度的正切值:0.9999999999999999
(2)指数函数方法
该方法的参数和返回值都是double型。
public class Trigonometric {
public static void main(String[] args) {
System.out.println("e的平方值:" + Math.exp(2));
System.out.println("以e为底2的对数值:" + Math.log(2));
System.out.println("以10为底10的对数值:" + Math.log10(100));
System.out.println("4的平方根:" + Math.sqrt(4));
System.out.println("8的平方根:" + Math.cbrt(8));
System.out.println("2的2次方值:" + Math.pow(2,2));
}
}
输出结果:
e的平方值:7.38905609893065
以e为底2的对数值:0.6931471805599453
以10为底10的对数值:2.0
4的平方根:2.0
8的平方根:2.0
2的2次方值:4.0
(3)取整函数方法
public class Trigonometric {
public static void main(String[] args) {
//返回大于等于参数的整数
System.out.println( Math.ceil(3.4) );
//返回小于等于参数的整数
System.out.println(Math.floor(2.5));
//返回与参数最接近的整数
System.out.println(Math.rint(2.7));
//返回与参数最接近的整数
System.out.println(Math.rint(2.5));
}
}
输出结果:
4.0
2.0
3.0
2.0 //数2.0和数3.0都和2.5距离相等,结果取偶数
(4)取最大值、取最小值、取绝对值函数方法
public class Trigonometric {
public static void main(String[] args) {
System.out.println("2和4较大者:" + Math.max(2,4));
System.out.println("4.4和4较小者:" + Math.min(4.4,4));
System.out.println("-7的绝对值:" + Math.abs(-7));
}
}
输出结果:
2和4较大者:4
4.4和4较小者:4.0
-7的绝对值:7
三、随机数
在Java中提供了两种方式产生随机数,分别为调用Math类的random()方法和Random类提供的产生各种数据类型随机数的方法。
1、Math.random()方法
- Math.random()方法默认生成大于等于0.0且小于1.0的double型随机数,即0<=Math.random()<=1.0
- 在 Math.random()语句稍加处理,就可以产生任意范围的随机数,如下所示:
(int)(Math.random()*n) //返回大于等于0且小于n的随机数
m + (int)(Math.random()*n) //返回大于等于m且小于m+n的随机数(不包括n+m)
public class MathRandom {
public static int getNum(double a, double b) {
//获取a~b之间的随机整数
int random = (int) a + (int) (Math.random() * (b - a));
//判断是否为偶数
if(random % 2 == 0){
//偶数直接返回
return random;
}else {
//奇数则加1返回
return random + 1;
}
}
public static void main(String[] args) {
System.out.println("2~34之间的随机偶数:" + getNum(2.0,34.0));
}
}
注意:Math.random()方法返回的值实际上是伪随机数,该方法通过当前时间作为随机数生成器的种子,经过一系列复杂的运算而得到的数。
2、random类
Java中还提供了一种可以获取随机数的方式,那就是java.util.Random类。语法格式如下所示:
Random r = new Random();
当实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不同,所产生的随机数也不同。
import java.util.Random;
public class RandomDemo {
public static void main(String[] args) {
Random random = new Random();
System.out.println("随机产生一个整数:" + random.nextInt());
System.out.println("随机产生一个大于等于0且小于10的整数:" + random.nextInt(10));
System.out.println("随机产生一个布尔型的值:" + random.nextBoolean());
System.out.println("随机产生一个双精度型的值:" + random.nextDouble());
System.out.println("随机产生一个单精度型的值" + random.nextFloat());
System.out.println("随机产生一个概率密度为高斯分布的双精度值" + random.nextGaussian());
}
}
输出结果:
随机产生一个整数:-1548082221
随机产生一个大于等于0且小于10的整数:6
随机产生一个布尔型的值:false
随机产生一个双精度型的值:0.9594825665646287
随机产生一个单精度型的值0.2622112
随机产生一个概率密度为高斯分布的双精度值-0.6863360067719766
四、大数字运算
Java提供了大数字的操作类,用于高精度计算,即java.math.BigInteger类和java.math.BigDecimal类。
1、BigInteger类
- BigInteger类型的数字范围较Integer类型的数字范围要大得多。
- BigInteger支持任意精度的整数。
- BigInteger类中封装了多种操作,除了基本的加、减、乘、除操作以外,还提供绝对值、相反数、最大公约数等。
使用BigInteger类可以实例化一个BigInteger对象,并自动调用相应的构造函数。BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。语法如下:
public BigInteger (String val){ //val是十进制字符串
//构造体
}
如果将数字20转换为BigInteger类型,可以使用下面的语句进行初始化操作:
BigInteger b = new BigInteger("20");
注意:参数20的双引号不能省略,因为参数是以字符串的形式存在。
一旦创建了BigInteger对象,就可以调用BigInteger类中的一些方法进行运算操作。
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInteger1 = new BigInteger("82");
BigInteger bigInteger2 = new BigInteger("93");
System.out.println("bigInteger1的值:" + bigInteger1);
System.out.println("bigInteger2的值:" + bigInteger2);
System.out.println("加法操作:" + bigInteger1.add(bigInteger2));
System.out.println("减法操作:" + bigInteger1.subtract(bigInteger2));
System.out.println("乘法操作:" + bigInteger1.multiply(bigInteger2));
System.out.println("除法操作:" + bigInteger1.divide(bigInteger2));
System.out.println("平方操作:" + bigInteger1.pow(2));
System.out.println("取反操作:" + bigInteger1.negate());
}
}
输出结果:
bigInteger1的值:82
bigInteger2的值:93
加法操作:175
减法操作:-11
乘法操作:7626
除法操作:0
平方操作:6724
取反操作:-82
2、BigDecimal类
- BigInteger类和BigDecimal类都能实现大数字的运算,不同的是BigDecimal类加入了小数的概念。
- BigDecimal类支持任何精度的定点数,可以用它来精确计算货币值。
- BigDecimal类常用的两个构造方法,如下所示:
public BigDecimal(double val) //实例化时将double型转换为BigDecimal类型
public BigDecimal(Strng val) //实例化时将字符串型转换为BigDecimal类型
BigDecimal类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等。其中,除法是最复杂的,因为要考虑除不尽的情况下末位小数点的处理。
import java.math.BigDecimal;
public class BigDecimalDemo {
/*
*定义加法运算
*/
public BigDecimal add(double value1, double value2){
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2);
}
/*
*定义减法运算
*/
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);
}
/*
*定义乘法运算
*/
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);
}
/*
*定义除法运算
*/
public BigDecimal div(double value1, double value2, int b){
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.divide(b2,b,BigDecimal.ROUND_HALF_UP);
}
public static void main(String[] args) {
BigDecimalDemo bigDecimalDemo = new BigDecimalDemo();
System.out.println("相加:" + bigDecimalDemo.add(12.2, 24.4));
System.out.println("相减:" + bigDecimalDemo.sub(12.2, 24.4));
System.out.println("相乘:" + bigDecimalDemo.mul(12.2, 24.4));
System.out.println("相除:" + bigDecimalDemo.div(12.2, 24.2, 5)); //保留小数点后5位
}
}
输出结果:
相加:36.6
相减:-12.2
相乘:297.68
相除:0.50413
以上是关于Java基础08—数字类处理的主要内容,如果未能解决你的问题,请参考以下文章