zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    类似最长递增子序,记忆化DP—— Codeforces Beta Round #4 (Div. 2 Only)D Mysterious Present
    最小逆序数对——hdu1394
    区间更新 求总区间——hdu1754
    抽象类 虚函数实现
    poj2271
    poj2246
    poj2410
    poj2567
    poj2247
    Integration Services 学习(7):包部署 (转自游子吟)
  • 原文地址:https://www.cnblogs.com/xuliang-daydayup/p/12900922.html
Copyright © 2011-2022 走看看