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—数字类处理的主要内容,如果未能解决你的问题,请参考以下文章

JAVA基础整理-21.02Java数字和日期处理

JSP基础

小白必看!java基础程序教程

使用 LibSVM 的 Java 代码中的 Weka 错误“无法处理数字类”

Java学习目录

Java基础系列9:BigInteger类和BigDecimal类