数字处理类Java----学习笔记整理

目录

 

一、BigDecimal(高精度的浮点数运算)

1.1、ROUND_UP

1.2、ROUND_DOWN

1.3、ROUND_CEILING

1.4、ROUND_FLOOR

1.5、ROUND_HALF_UP

1.6、ROUND_HALF_DOWN

1.7、ROUND_HALF_EVEN    银行家舍入法

1.8、ROUND_UNNECESSARY

二、Biginteger(高精度的整数运算)

三、Math.random()方法

四、Math类(精度要求比较高的运算不适合)

五、数字格式化


一、BigDecimal(高精度的浮点数运算)

 

  •   用来对超过16位有效位的数进行精确的运算。
  •   用于商业计算
  • BigDecimal.ROUND_HALF_XXX的各种用法
  • 在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。其中8种舍入方式值得掌握。

1.1、ROUND_UP

  • 舍入远离零的舍入模式。
  • 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
  • 注意:此舍入模式始终不会减少计算值的大小。

1.2、ROUND_DOWN

  • 接近零的舍入模式。
  • 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
  • 注意:此舍入模式始终不会增加计算值的大小。

1.3、ROUND_CEILING

  • 接近正无穷大的舍入模式。
  • 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
  • 如果为负,则舍入行为与 ROUND_DOWN 相同。
  • 注意:此舍入模式始终不会减少计算值。

1.4、ROUND_FLOOR

  • 接近负无穷大的舍入模式。
  • 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
  • 如果为负,则舍入行为与 ROUND_UP 相同。
  • 注意:此舍入模式始终不会增加计算值。

1.5、ROUND_HALF_UP

  • 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
  • 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
  • 注意:这是我们大多数人在小学时就学过的舍入模式(四舍五入)。

1.6、ROUND_HALF_DOWN

  • 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
  • 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

1.7、ROUND_HALF_EVEN    银行家舍入法

  • 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
  • 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
  • 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
  • 注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
  • 此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况。
  • 如果前一位为奇数,则入位,否则舍去。

以下例子为保留小数点1位,那么这种舍入方式下的结果。

1.15>1.2 1.25>1.2

1.8、ROUND_UNNECESSARY

  • 断言请求的操作具有精确的结果,因此不需要舍入。
  • 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。             
public BigDecimal div(double value1, double value2) {
            return div(value1, value2, location); // 调用自定义除法方法
        }
        
        // 定义除法方法,参数分别为除数与被除数以及商小数点后的位数
        public BigDecimal div(double value1, double value2, int b) {
            if (b < 0) {
                System.out.println("b值必须大于等于0");
            }
            BigDecimal b1 = new BigDecimal(Double.toString(value1));
            BigDecimal b2 = new BigDecimal(Double.toString(value2));
            // 调用除法方法,商小数点后保留b位,并将结果进行四舍五入操作
            return b1.divide(b2, b, BigDecimal.ROUND_HALF_UP);
        }
        
        public static void main(String[] args) {
        cc b = new cc();
            System.out.println("两个数字相加结果:" + b.add(-7.5, 8.9));
            System.out.println("两个数字相减结果:" + b.sub(-7.5, 8.9));
            System.out.println("两个数字相乘结果:" + b.mul(-7.5, 8.9));
            System.out.println("两个数字相除结果,结果小数后保留10位:"+b.div(10, 2));
            System.out.println("两个数字相除,保留小数后5位:"+b.div(-7.5,8.9, 5));
            }

                              

public static BigDecimal div(double value1,double value2,int b,int r){
        if(b<0){
            System.out.println("b值必须大于等于0");
        }
        BigDecimal b1=new BigDecimal(Double.toString(value1));
        BigDecimal b2=new BigDecimal(Double.toString(value2));
        return b1.divide(b2,b,r);
    }
    public static void main(String[] args) {
        // TODO 自动生成方法存根
        UseCase u=new UseCase();
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_CEILING));
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_DOWN));
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_FLOOR));
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_HALF_DOWN));
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_HALF_EVEN));
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_HALF_UP));
        System.out.println(u.div(-7.5,8.9,5,BigDecimal.ROUND_UP));
    }

二、Biginteger(高精度的整数运算)

 

  •     在BigInteger类中封装了多种操作,除了基本的加减乘除操作外,还提供了绝对值,相反数,最大公约数以及判断是否为        质数等的操作。
  •     使用BigInteger类时,可实例化一个BigInteger对象,并自动调用相应的构造函数。
  •     BigInteger类具有很多构造函数,最直接的一种方式是参数以字符串的形式代表要处理的数字。
               BigInteger bigInstance = new BigInteger("4"); // 实例化一个大数字
        // 取该大数字加2的操作
        System.out.println("加法操作:" + bigInstance.add(new BigInteger("2")));
        // 取该大数字减2的操作
        System.out.println("减法操作:"
                + bigInstance.subtract(new BigInteger("2")));
        // 取该大数字乘以2的操作
        System.out.println("乘法操作:"
                + bigInstance.multiply(new BigInteger("2")));
        // 取该大数字除以2的操作
        System.out.println("除法操作:"
                + bigInstance.divide(new BigInteger("2")));
        // 取该大数字除以3的商
        System.out.println("取商:"
                + bigInstance.divideAndRemainder(new BigInteger("3"))[0]);
        // 取该大数字除以3的余数
        System.out.println("取余数:"
                + bigInstance.divideAndRemainder(new BigInteger("3"))[1]);
        // 取该大数字的2次方
        System.out.println("做2次方操作:" + bigInstance.pow(2));
        // 取该大数字的相反数
        System.out.println("取相反数操作:" + bigInstance.negate());


三、Math.random()方法

     用于的产生随机数,产生的随机数0

public static int GetEvenNum(double num1, double num2) {
        // 产生num1~num2之间的随机数
        int s = (int) num1 + (int) (Math.random() * (num2 - num1)); 
        if (s % 2 == 0) { // 判断随机数是否为偶数
            return s; // 返回
        } else
            // 如果是奇数
            return s + 1; // 将结果加1后返回
    }
    
    public static void main(String[] args) {
        System.out.println("任意一个2~32之间的偶数:" + GetEvenNum(2, 11));


random类(Java.util.Random)
    通过实例化一个Random对象创建一个随机数生成器


                 Random r = new Random(); // 实例化一个Random类
        // 随机产生一个整数
        System.out.println("随机产生一个整数:" + r.nextInt());
        // 随机产生一个大于等于0小于10的整数
        System.out.println("随机产生一个大于等于0小于10的整数:" + r.nextInt(10));
        // 随机产生一个布尔型的值
        System.out.println("随机产生一个布尔型的值:" + r.nextBoolean());
        // 随机产生一个双精度型的值
        System.out.println("随机产生一个双精度型的值:" + r.nextDouble());
        // 随机产生一个浮点型的值
        System.out.println("随机产生一个浮点型的值:" + r.nextFloat());
        // 随机产生一个概率密度为高斯分布的双精度值
        System.out.println("随机产生一个概率密度为高斯分布的双精度值:"
                + r.nextGaussian());

            }


四、Math类(精度要求比较高的运算不适合)


          math类中提供了众多函数方法

// 取90度的正弦
                System.out.println("90度的正弦值:" + Math.sin(Math.PI / 2));
                System.out.println("0度的余弦值:" + Math.cos(0)); // 取0度的余弦
                // 取60度的正切
                System.out.println("60度的正切值:" + Math.tan(Math.PI / 3));
                // 取2的平方根与2商的反正弦
                System.out.println("2的平方根与2商的反弦值:"
                        + Math.asin(Math.sqrt(2) / 2));
                // 取2的平方根与2商的反余弦
                System.out.println("2的平方根与2商的反余弦值:"
                        + Math.acos(Math.sqrt(2) / 2));
                System.out.println("1的反正切值:" + Math.atan(1)); // 取1的反正切


System.out.println("e的平方值:" + Math.exp(2)); // 取e的2次方
        // 取以e为底2的对数
        System.out.println("以e为底2的对数值:" + Math.log(2));
        // 取以10为底2的对数
        System.out.println("以10为底2的对数值:" + Math.log10(2));
        System.out.println("4的平方根值:" + Math.sqrt(4)); // 取4的平方根
        System.out.println("8的立方根值:" + Math.cbrt(8)); // 取8的立方根
        System.out.println("2的2次方值:" + Math.pow(2, 2)); // 取2的2次方

// 返回第一个大于等于参数的整数
        System.out.println("使用ceil()方法取整:" + Math.ceil(5.2));
        // 返回第一个小于等于参数的整数
        System.out.println("使用floor()方法取整:" + Math.floor(2.5));
        // 返回与参数最接近的整数
        System.out.println("使用rint()方法取整:" + Math.rint(2.7));
        // 返回与参数最接近的整数
        System.out.println("使用rint()方法取整:" + Math.rint(2.5));
        // 将参数加上0.5后返回最接近的整数
        System.out.println("使用round()方法取整:" + Math.round(3.4f));
        // 将参数加上0.5后返回最接近的整数,并将结果强制转换为长整型
        System.out.println("使用round()方法取整:" + Math.round(2.5));
    }

System.out.println("4和8较大者:" + Math.max(4, 8)); 
         // 取两个参数的最小值
        System.out.println("4.4和4较小者:" + Math.min(4.4, 4));
        System.out.println("-7的绝对值:" + Math.abs(-7)); // 取参数的绝对值

五、数字格式化

  •   Java中使用Java.text.DecimalFormat,格式化数字
  •  DecimalFormat类是NumberFormat的子类,用于格式化十进制数字
  • 可通过DecimalFormat对象传递数字格式,也可通过DecimalFormat类中的applyPattern();方法类实现数字格式化
//实例化对象时设置格式化模式(默认模式)
 static public void SimgleFormat(String pattern,double value){

   DecimalFormat MyFormat = new DecimaFormat(pattern);
   String output = MyFormat.format(value); //将数字格式化
   System.out.printIn(value +"" +pattern + "" +output);

}

//使用applyPattern()方法对数字进行格式化     指定模式
static public void  UseApplyPattern(String pattern,double value){
 DecimalFormat MyFormat = new DecimalFormat();//实例化DecimalFormat对象
 MyFormat.applyPattern(pattern);
 System.out.println(value + " " + pattern + " " + myFormat.format(value));

}
   //在mian主函数中调用
   public static void main(String[] args){
   SimgleFormat("###.###",1243.2145);
   SimgleFormat("00000000.###kg", 123456.789);  // 在数字后加上单位

        // 按照格式模板格式化数字,不存在的位以0显示
    SimgleFormat("000000.000", 123.78);
 UseApplyPattern("#.###%",0.789);               //将数字转化为百分数


                ("###.##", 123456.789);    // 将小数点后格式化为两位
                 ("0.00\u2030", 0.789);     // 将数字转化为千分数形式
}

 

  •    字符                                                   含义
  •     0              代表阿拉伯数字, 0表示数字的以为阿拉伯数字如果改为不存在水数字则显 示0
  •     #              每一个#代表一个阿拉伯数字,如果改为存在数字则显示字符 如果该位不存在数字则不显示
  •     .               小数分隔符
  •     -               负号
  •     ,            逗号分组分隔符
  •     E             分隔科学计数法中的尾数和指数
  •     %              本符号放在数字的前面或后面,数字以百分数形式显示
  •  u2030            本符号放在数字的前缀或后缀,数字以千分数的形式显示
  •  u00A4             本符号放在数字的前缀或后缀,作为货币记号
  •   
  •     ’                单引号,让特殊字符出现在数字中,应为特殊符号添加单引号,系统会将此符号视为普通符号处理
  •  

         

DecimalFormat myFormat = new DecimalFormat();
        myFormat.setGroupingSize(2); // 设置将数字分组为2
        String output = myFormat.format(123456.789);
        System.out.println("将数字以每两个数字分组 " + output);
        myFormat.setGroupingUsed(false); // 设置不允许数字进行分组
        String output2 = myFormat.format(123456.789);
        System.out.println("不允许数字分组 " + output2);

 

你可能感兴趣的:(Java基础篇)