超精度类型的数据

整型数据极限值的运算精度保留 -- BigInteger类
/*
    超大的整数值的运算精度保留 -- BigInteger类

    BigInteger类 -- java.math
*/
import java.math.*;

class Demo1
{
    public static void main(String[] args)
    {
        System.out.println("===int类型的极限值的运算===");
        //接近int 类型数据的极限值的两个变量
        int num1 = 2147483647;
        int num2 = 2147483645;
        //求和的结果
        //原因:两个int极限值运算时候超过int类型变量的范围,导致运算结果出错
        int sum = num1 + num2;  //-4
        System.out.println("sum = " + sum);
        //解决:极限值的运算升数据类型,仍然会出现计算错误
        //第一种:直接放入long类型的变量中
        long sum1 = num1 + num2;//-4
        System.out.println("sum1 = " + sum1);

        //定义两个long类型的极限值
        System.out.println(Long.MAX_VALUE);//9223372036854775807
        long l_num1 = 9223372036854775803l;
        long l_num2 = 9223372036854775804l;
        long l_sum = l_num1 + l_num2; //-9
        System.out.println("l_sum = " + l_sum);
        //最终:极限的数值放入到BigInteger类的对象数据中
        //int类型 --> BigInteger类型的数据 --> String类型的超大数值
        //第一种:
        BigInteger b1 = new BigInteger(num1 + "");
        BigInteger b2 = new BigInteger(num2 + "");
        System.out.println("b1 = " + b1); //2147483647
        System.out.println("b2 = " + b2); //2147483645
        //两个BigInteger类型的变量求和 --- 运算方法
        BigInteger b_sum = b1.add(b2);
        System.out.println("b_sum = " + b_sum);

        //求两个int极限值的平均值 sum/2
        //divide(val)
        BigInteger value = new BigInteger(2 + "");
        BigInteger mean = b_sum.divide(value); //b_sum/2
        System.out.println("mean = " + mean);

        //求两个极限值的较大的值
        BigInteger max = b1.max(b2);
        System.out.println("max = " + max);
    }
}

浮点型数据精度上升型保留/下降式保留 -- BigDecimal类
/*
    超精度浮点型数据类型 --- BigDecimal类

    java.math.
*/
import java.math.*;

class Demo2  
{
    public static void main(String[] args)
    {
        System.out.println("===浮点型数据精度===");
        //double精度值的整数部分为0,最多小数点后17位可见
        //保留15个有效精度值
        double num = 10.90129019201920109;
        System.out.println("num = " + num);
        //将精度值升高到jvm可以接收的最大精度
        //double类型的变量放入到BigDecimal类型的变量中
        //浮点型 --> BigDecimal类型自动升到最大精度值
        BigDecimal b_num = new BigDecimal(num);
        //10.9012901920192017968247455428354442119598388671875
        System.out.println("b_num = " + b_num);
        //BigInteger类型的变量 --> BigDecimal类型的变量
        //整数类型的数据 --> BigDecimal类型精度不会发生改变
        BigDecimal i_num = new BigDecimal(new BigInteger(2179881289l + ""));
        System.out.println("i_num = " + i_num);
        //float类型的变量 --> BigDecimal类型的变量中
        BigDecimal f_num = new BigDecimal(89.7687f);

        //两个BigDecimal变量求和
        BigDecimal sum = b_num.add(i_num);
        System.out.println("sum = " + sum);
        //求积
        BigDecimal sub = b_num.multiply(f_num);
        

        //将BigDecimal的乘积转换成double数据
        double d_num = sub.doubleValue();
        //BigDecimal类型的数据保留精度值
        //第一种:创建BigDecimal类型的变量同时,制定精度
        //MathContext类 -- 舍入模式
        //MathContext mc = new MathContext(int precision,RoundingMode mode)
        //int precision -- 保留的科学精度(整数部分+小数部分)
        //RoundingMode -- 舍入模式,UP/DOWN/HALF_UP
        //创建一个MathContext类的变量,制定舍入后的小数点精度
        //采用四舍五入的舍入模式,保留数据为6位的科学精度
        MathContext mc = new MathContext(6,RoundingMode.HALF_UP);
        BigDecimal m_num = new BigDecimal(d_num,mc);
        System.out.println("保留6位科学精度后的double数据:" + m_num);

        //第二种:调用setScale()方法,设置BigDecimal的有效小数点位数
        //setScale(int newScale,RoundingMode mode)
        BigDecimal sub_precision = sub.setScale(6,RoundingMode.HALF_EVEN);
        System.out.println("保留6位小数点后的sub的值:" + sub_precision);
    }
}