• 关于BigInteger和BigDecimal


    BigInteger

    • BigInteger类是用于解决整形类型(含基本数据类型及对应的包装类,)无法表示特别大的数字及运算的问题,即使是占用字节数最多的整形long,能表示的范围也是有限的.
    • 理论上,你可以使用BigInteger表示任意整数
    • 基于java8中BigInteger的构造方法.
      在这里插入图片描述
      BigDecimal的构造方法2
      在这里插入图片描述
    String value="777777733333322222999991111111999999933333399999999333333399999955555999995555";
    BigInteger number=new BigInteger(value);
    
    
    • 1
    • 2
    • 3

    BigInteger的运算方式

    • 不可以使用运算符号处理BigInteger的运算
      • 本质上通过BigInteger类创建出来的是一个个对象,并不是数字,
    • 你必须通过BigInteger提供的Api实现需要的运算
      • 例如:public BigInteger add(BigInteger val)
    import java.math.BigInteger;
    
    public class BigIntegerDemo {
        public static void main(String[] args) {
            //下面的value已经超过了long的最大长度
            String value1="7777777777777777666666666666666644444444444444222222222222222";
            String value2="6666666666666666444444444444442222222222222221111111111000000";
            BigInteger number1=new BigInteger(value1);
            BigInteger number2=new BigInteger(value2);
            System.out.println(number1);
            System.out.println(number2);
            BigInteger result;
    
            result = number1.add(number2);
            System.out.println(result);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    BigInteger的常用API如下

    在这里插入图片描述

    import java.math.BigInteger;
    
    public class BigIntegerDemo {
        public static void main(String[] args) {
            //下面的value已经超过了long的最大长度
            String value1="7777777777777777666666666666666644444444444444222222222222222";
            String value2="6666666666666666444444444444442222222222222221111111111000000";
            BigInteger number1=new BigInteger(value1);
            BigInteger number2=new BigInteger(value2);
            System.out.println(number1);
            System.out.println(number2);
            BigInteger result;
           //加法
            result = number1.add(number2);
            System.out.println(result);
           //减法
            result=number1.subtract(number2);
            System.out.println(result);
    
            //乘法
            result=number1.multiply(number2);
            System.out.println(result);
    
            //除法
            result=number1.divide(number2);
            BigInteger[] bigIntegers = number1.divideAndRemainder(number2);
            System.out.println(result);
    
            //除法并求余数
            //result2[0]是除法的结果   result2[1]是余数的结果
            BigInteger[] result2 = number1.divideAndRemainder(number2);
            System.out.println(result2);
            System.out.println("===============");
            System.out.println(result2[0]);
            System.out.println(result2[1]);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    将BigInteger转换成为基本类型

    在这里插入图片描述
    == 注意:在进行装换之前,应该明确是否会丢失精度,避免转换结果不符合预期==

    BigInteger小结

    • 使用BigInteger可以表示非常大的整数
    • BigInteger的构造方法重载了几次,推荐使用String作为参数的那个
    • 当需要算术运算时,必须使用BigInteger提供的API
    • BigInteger的API几乎包括了你能想到的所有数值操作;
    • 你可以将BigInteger装换成任何基本数据类型,但可能丢失精度
      • 在装换之前,应先明确是否可能丢失精度
      • 你不一定需要将结果转装换为数值类型,是字符串也可以用于显示或存储

    处理大数字的建议

    在这里插入图片描述

    关于BigDecimal

    • 使用float,double及其对应的包装类时,运算精度可能不满足需求
      • float最多只有7位有效数,则其精度为6~7位
      • double最多只有16位有效数,则其精度为15~16
    • 使用float,double及其对应的包装类时,不便于小数点以后的若干为进行截取,四舍五入或相关处理
    import java.math.BigDecimal;
    import java.math.BigInteger;
    
    public class BigDecimalDemo {
        public static void main(String[] args) {
            //创建2个基本类型的浮点数
            double d1=0.1;
            double d2=0.2;
            //使用2个double求和的结果
            System.out.println(d1+d2);//0.30000000000000004
    
    
            //创建2个BigDecimal对象
            String s1="0.1";
            String s2="0.2";
            BigDecimal number1=new BigDecimal(s1);
            BigDecimal number2=new BigDecimal(s2);
    
            BigDecimal add = number1.add(number2);
            System.out.println(add);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    通过静态方法创建BigDecimal对象

    在这里插入图片描述

    import java.math.BigDecimal;
    import java.math.BigInteger;
    
    public class BigDecimalDemo {
        public static void main(String[] args) {
            //创建2个基本类型的浮点数
            double d1=0.1;
            double d2=0.2;
            //使用2个double求和的结果
            System.out.println(d1+d2);//0.30000000000000004
    
    
             //用它的静态方法valueOf()方法创建BigDecimal对象
            BigDecimal number3=BigDecimal.valueOf(d1);
            BigDecimal number4=BigDecimal.valueOf(d2);
    
            BigDecimal add1 = number3.add(number4);
            System.out.println(add1);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    我们看见BigDecimal还有如下的构造方法
    在这里插入图片描述

    import java.math.BigDecimal;
    import java.math.BigInteger;
    
    public class BigDecimalDemo {
        public static void main(String[] args) {
            //创建2个基本类型的浮点数
            double d1=0.1;
            double d2=0.2;
            //使用2个double求和的结果
            System.out.println(d1+d2);//0.30000000000000004
    
    
            //创建2个BigDecimal对象
            String s1="0.1";
            String s2="0.2";
            BigDecimal number1=new BigDecimal(s1);
            BigDecimal number2=new BigDecimal(s2);
    
            BigDecimal add = number1.add(number2);
            System.out.println(add);
    
    //当原数使用double表示时,不要使用double作为构造方法的参数来创建BigDecimal对象.
            BigDecimal number5=new BigDecimal(d1);
            BigDecimal number6=new BigDecimal(d2);
            BigDecimal add2 = number5.add(number6);
            System.out.println(add2);//结果是不对的
    
            /**
             * 小结:当原数使用String表示时,使用构造方法创建BigDecimal对象
             * 当原数使用double表示时,使用静态valueOf()方法创建BigDecimal
             * 当原数使用double表示时,不要使用double作为构造方法的参数来创建BigDecimal对象.
             */
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    小结

    • 当原数使用String表示时,使用构造方法创建BigDecimal对象
    • 当原数使用double表示时,使用静态valueOf()方法创建BigDecimal
    • 当原数使用double表示时,不要使用double作为构造方法的参数来创建BigDecimal对象.

    BigDecimal常用的api

    在这里插入图片描述
    在这里插入图片描述

    除法运算的roundingMode

    • 关于除法divide()方法,使用roundingMode可以设置运算时的舍入模式(是舍入模式,不是舍去模式)
    • 使用BigDecimal类中以Round为前缀的常量表示
      • 例如:BigDecimal.ROUND_HALF_UP
        在这里插入图片描述
    import java.math.BigDecimal;
    import java.math.BigInteger;
    
    public class BigDecimalDemo {
        public static void main(String[] args) {
            //创建2个基本类型的浮点数
            double d1=0.13;
            double d2=0.234;
            //使用2个double求和的结果
            System.out.println(d1+d2);//0.30000000000000004
    
    
            //创建2个BigDecimal对象
            String s1="0.1";
            String s2="0.025";
            BigDecimal number1=new BigDecimal(s1);
            BigDecimal number2=new BigDecimal(s2);
    
            BigDecimal add = number1.add(number2);
            System.out.println(add)
    
            BigDecimal divide = number1.divide(number2);
            System.out.println(divide);
    
            BigDecimal divide1 = number1.divide(number2, BigDecimal.ROUND_UP);
            System.out.println(divide1);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    将BigDecimal转换为基本类型

    在这里插入图片描述

    BigDecimal小结

    • 使用BigDecimal主要解决基本数据类型运算精度不足的问题
    • 当原数使用String表示时,使用构造方法创建BigDecimal对象
    • 当原数使用double表示时,使用valueOf()静态方法创建BigDecimal对象
    • 当需要进行运算时,必须使用BigDecimal提供的API
    • BigDecimal的API几乎包括了你能想到的所有数据操作
    • 你可以将BigInteger装换成任何基本数据类型,单可能丢失精度
      • 在转换之前,应先明确是否可能丢失精度
      • 你不一定需要将结果转换为数值型,使用字符串也可以用于显示或存储.

    处理高精度数据的建议

    在这里插入图片描述

    关于NumberFormat类

    • NumberFormat类是java.text包中的一个工具类,它主要作用是对数值进行格式化,得到期望格式的字符串.
      • 例如,当你期望将数字装换称为把粉笔格式时,输入0.37,将得到37%
      • 注意:只要对象的本质是数值,均可格式化
        + BingInteger,BigDecimal.String等
      • 格式化后得到的是StringBuffer对象
        + 一定程度上,你可以把StringBuffer直接理解为String
    • NumberFormat类是抽象类,不可以直接创建对象

    预置的几种NumberFormat

    • 你可以通过NumberFormat的几个静态方法得到预置的NumberFormat对象
      在这里插入图片描述
    import java.math.BigDecimal;
    import java.text.NumberFormat;
    
    public class NumberFormatDemo {
        public static void main(String[] args) {
            //将被格式化的数
            double value=95.32;
            BigDecimal number=BigDecimal.valueOf(value);
    
            //获取NumberFormat工具对象
            NumberFormat percentInstance = NumberFormat.getPercentInstance();
            NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
    
            //执行格式化
            String format = percentInstance.format(number);
            String format1 = percentInstance.format(value);
            System.out.println(format);
            System.out.println(format1);
            String format2 = currencyInstance.format(number);
            String format3 = currencyInstance.format(value);
            System.out.println(format2);
            System.out.println(format3);
    
            /**
             * 9,532%
             * 9,532%
             * ¥95.32
             * ¥95.32
             */
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    关于Locale对象

    • 可以通过Locale的静态常量获取该类型对象,例如
      在这里插入图片描述
    import java.math.BigDecimal;
    import java.text.NumberFormat;
    import java.util.Locale;
    
    public class NumberFormatDemo {
        public static void main(String[] args) {
            //将被格式化的数
            double value=95.32;
            BigDecimal number=BigDecimal.valueOf(value);
    
            //获取NumberFormat工具对象.Locale.法国的,记住后面.的不一定是国家,它是地区.比如中国香港,和中国大陆是不一样的.
            NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.FRANCE);
    
         
            String format2 = currencyInstance.format(number);
            String format3 = currencyInstance.format(value);
            System.out.println(format2);
            System.out.println(format3);
    
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    小结

    • 使用NumberFormat 可以将数值格式化为特点的格式,包括
      • 数字
      • 整形数
      • 货币样式(可设置地区)
      • 百分比
    • 只要数据的本质是数值,都可以格式化
    • 先通过NumberFormat的静态方法获取对象,在调用format()方法即可得到格式化后的字符串
      • 根据期望目标格式,调用不同的方法
      • 得到的结果是StringBuffer对象
  • 相关阅读:
    BIO、NIO、AIO三者的区别及其应用场景(结合生活例子,简单易懂)
    解锁网页开发的力量:深入探讨 JavaScript 编程
    【uniapp】通用列表封装组件
    Visual Studio扩展插件
    本地 HTTP 文件服务器的简单搭建 (deno/std)
    2022年下半年网络规划设计师考试下午真题
    【教程】微信推文怎么添加附件文档 (如word文档、excel表格、pdf文件)
    设计模式 — — 前端
    NC5 二叉树根节点到叶子节点的所有路径和
    在Ascend上,单卡精度可以很好,但多卡精度很差
  • 原文地址:https://blog.csdn.net/weixin_51599093/article/details/128051747