zoukankan      html  css  js  c++  java
  • BigDecimal && DecimalFormat 关于精度的啦啦啦

    1、构造方法(常用):

    BigDecimal(String val)
    BigDecimal(long val)
    BigDecimal(int val)
    BigDecimal(double val)

    2、所以尽量使用一字符串作为参数的构造方法,如果源头是double,那样的话,先用toString方法变成string正;

    System.out.println(new BigDecimal("3.21"));// 3.32,超级精确                                                
    System.out.println(new BigDecimal(3.21));// 3.20999999999999996447286321199499070644378662109375  卡玛冇精确

    3、加减乘除,因为BigDecimal的对象是immutable(不可变的),所以执行加减乘除之后记得用东东来接收它,而不要以为用调用的那个对象(下面的例子指b1)

    public static void main(String[] args) {                                                   
        BigDecimal b1 = new BigDecimal(Double.toString(3.21));// 看到了没有,变成String先               
        BigDecimal b2 = new BigDecimal(Double.toString(2.31));                                 
        // 用一个新的变量来接收,不要以为b1就是了,用doubleValue返回double类型                                         
        // 加法操作                                                                                
        double b3 = b1.add(b2).doubleValue();                                                  
        // 减法操作                                                                                
        double b4 = b1.subtract(b2).doubleValue();                                             
        // 乘法操作                                                                                
        double b5 = b1.multiply(b2).doubleValue();                                             
    }                                                                                          
    // 除法                                                                                      
    public static double div(double v1, double v2, int scale) {                                
        if (scale < 0) {                                                                       
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }                                                                                      
        BigDecimal b1 = new BigDecimal(Double.toString(v1));                                   
        BigDecimal b2 = new BigDecimal(Double.toString(v2));                                   
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();                   
    }                                                                                          
    // 对小数位进行四舍五入处理                                                                            
    public static double round(double v, int scale) {                                          
        if (scale < 0) {                                                                       
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }                                                                                      
        BigDecimal b = new BigDecimal(Double.toString(v));                                     
        BigDecimal one = new BigDecimal("1");                                                  
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();                   
    }                                                                                          

     4、setScale

    // 如果为正数,则进行RoundUp操作,否则,RoundDown操作(ceil为天花板的意思,联想为大)                                     
    System.out.println(new BigDecimal("1.221").setScale(2,BigDecimal.ROUND_CEILING));// 1.23   
    System.out.println(new BigDecimal("-1.221").setScale(2,BigDecimal.ROUND_CEILING));// -1.22 
    // 如果为正数,则进行RoundDown操作,否则,RoundUp操作(floor就是地板的意思,联想为小)                                    
    System.out.println(new BigDecimal("1.228").setScale(2,BigDecimal.ROUND_FLOOR));// 1.22     
    System.out.println(new BigDecimal("-1.228").setScale(2,BigDecimal.ROUND_FLOOR));// -1.23   
    // 无论为正数还是为负数,都进行ROUND_UP操作                                                                
    System.out.println(new BigDecimal("1.125").setScale(2, BigDecimal.ROUND_UP));// 1.13       
    System.out.println(new BigDecimal("-1.125").setScale(2, BigDecimal.ROUND_UP));// -1.13     
    // 无论为正数还是为负数,都进行ROUND_DOWN操作                                                              
    System.out.println(new BigDecimal("1.125").setScale(2, BigDecimal.ROUND_DOWN));// 1.12     
    System.out.println(new BigDecimal("-1.125").setScale(2, BigDecimal.ROUND_DOWN));// -1.12   
    // ROUND_HALF_UP 才是正宗版的四舍五入,ROUND_HALF_DOWN的区别是请看下面的例子                                     
    System.out.println(new BigDecimal("1.125").setScale(2, BigDecimal.ROUND_HALF_DOWN));// 1.12
    System.out.println(new BigDecimal("1.125").setScale(2, BigDecimal.ROUND_HALF_UP));// 1.13  
    System.out.println(new BigDecimal("1.124").setScale(2, BigDecimal.ROUND_HALF_DOWN));// 1.12
    System.out.println(new BigDecimal("1.124").setScale(2, BigDecimal.ROUND_HALF_UP));// 1.12  
    System.out.println(new BigDecimal("1.126").setScale(2, BigDecimal.ROUND_HALF_DOWN));// 1.13
    System.out.println(new BigDecimal("1.126").setScale(2, BigDecimal.ROUND_HALF_UP));// 1.13  

    5、比较:compareTo

    BigDecimal aa = new BigDecimal("2.00");       
    BigDecimal bb = new BigDecimal("2.0");        
    BigDecimal cc = new BigDecimal("3.0");        
    BigDecimal dd = new BigDecimal("1.000");      
    System.out.println(aa.compareTo(bb));// 相等就是0 
    System.out.println(aa.compareTo(cc));// 小于就是-1
    System.out.println(aa.compareTo(dd));// 大于就是1 
    System.out.println(aa.min(cc));// 返回较小者       
    System.out.println(aa.max(cc));// 返回较大者       

     6、注意:千万不能用 equals 来比较(例如:aa.equalsTo(bb)),会出事的。注意啦注意啦!

     7、 DecimalFormat  类

    /**
    * 1. 以“0”补位时:
    * 如果数字少了,就会补“0”,小数和整数都会补;
    * 如果数字多了,就切掉,但只切小数的末尾,整数不能切;
    * 同时被切掉的小数位会进行四舍五入处理。
    * 2. 以“#”补位时:
    * 如果数字少了,则不处理,不会补“0”,也不会补“#”;
    * 如果数字多了,就切掉,但只切小数的末尾,整数不能切;
    * 同时被切掉的小数位会进行四舍五入处理。
    * 说白了,就是“0”会补,“#”不会补
    */

    public
    static void main(String[] args) { double pi=3.1415927; // 好厉害好厉害好厉害好厉害 System.out.println(new DecimalFormat("#.##%").format(pi)); //314.16%,变成百分号,非常非常非常非常的厉害 System.out.println(new DecimalFormat("0").format(pi)); //3 System.out.println(new DecimalFormat("0.00").format(pi)); //3.14 System.out.println(new DecimalFormat("00.000").format(pi)); //03.142 System.out.println(new DecimalFormat("##.##").format(pi)); //3.142 System.out.println(new DecimalFormat("#").format(pi)); //3 System.out.println(new DecimalFormat("0.000").format(1.2)); // 1.200 System.out.println(new DecimalFormat("#.###").format(1.2)); // 1.2 // 好强大,通常用于货币的啦:"###,###.##" 好强大好强大 "###,###.00" double aaa = 11223344556677.8899; System.out.println(new DecimalFormat("###,###.##").format(aaa)); // 11,223,344,556,677.89,加入千分位并且保留2位小数 System.out.println(new DecimalFormat("###,###.000000").format(aaa)); // 11,223,344,556,677.890000,加入千分位并且补0 // 这里的主要意义是补其它字符 long c=299792458; System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c)); //光速大小为每秒299,792,458米。 String monty = DecimalFormat.getCurrencyInstance().format(123456789); System.out.println(monty);
    }

    asd

  • 相关阅读:
    高效实用的.NET开源项目
    【转载】代理模式应用实例
    开源的 Restful Api 集成测试工具 Hitchhiker
    【转载】C#反射机制详解
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    【转载】C#之玩转反射
    python管道pipe
    如何防范短信接口被恶意调用
    TCP三次握手,四次分手
    psycopg事务
  • 原文地址:https://www.cnblogs.com/ericguoxiaofeng/p/7512236.html
Copyright © 2011-2022 走看看