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

原文地址:https://www.cnblogs.com/ericguoxiaofeng/p/7512236.html