BigDecimal

一、什么是BigDecimal

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理。

一般情况下,对于那些不需要准确计算精度的数字,我们可以直接使用Float和Double处理,但是Double.valueOf(String) 和Float.valueOf(String)会丢失精度。所以开发中,如果我们需要精确计算的结果,则必须使用BigDecimal类来操作。

BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

二、BigDecimal常用的构造函数

2.1、常用构造函数

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

三、BigDecimal常用的方法

3.1、常用方法

// 相加
add(BigDecimal);

// 相减
subtract(BigDecimal);

// 相乘
multiply(BigDecimal);

// 相除
divide(BigDecimal);

3.2、BigDecimal大小比较

java中对BigDecimal比较大小一般用的是bigDecimal的CompareTo方法

int a = bigdecimal.compareTo(bigdecimal2);
/*
a = -1,表示bigdemical小于bigdemical2;
a = 0,表示bigdemical等于bigdemical2;
a = 1,表示bigdemical大于bigdemical2;
*/

例如:a大于等于b

new bigdemica(a).compareTo(new bigdemical(b)) >= 0

四、BigDecimal格式化

NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制

BigDecimal对货币的百分比格式化

  • 创建BigDecimal对象,进行BigDecimal的算术运算后
  • 分别建立对货币和百分比格式化引用
  • 利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比
// 建立货币格式化引用
NumberFormat currency = NumberFormat.getCurrencyInstance();
// 建立百分比格式化引用
NumberFormat percent = NumberFormat.getPercentInstance();
// 百分比小数点最多3位
percent.setMaximumFractionDigits(3);
// 贷款金额
BigDecimal loanAmount = new BigDecimal("15000.48");
// 利率
BigDecimal interestRate = new BigDecimal("0.008");
// 相乘
BigDecimal interest = loanAmount.multiply(interestRate);
System.out.println("贷款金额:\t" + currency.format(loanAmount));
System.out.println("利率:\t" + percent.format(interestRate));
System.out.println("利息:\t" + currency.format(interest));

/**
 * 贷款金额:	¥15,000.48
 * 利率:	0.8%
 * 利息:	¥120.00
 */

BigDecimal格式化保留2为小数,不足则补0

/**
     * @desc 1.0~1之间的BigDecimal小数,格式化后失去前面的0,则前面直接加上0。
     * 2.传入的参数等于0,则直接返回字符串"0.00"
     * 3.大于1的小数,直接格式化返回字符串
     * @param obj传入的小数
     * @return
     */
    public static String formatToNumber(BigDecimal obj) {
        DecimalFormat df = new DecimalFormat("#.00");
        if(obj.compareTo(BigDecimal.ZERO)==0) {
            return "0.00";
        }else if(obj.compareTo(BigDecimal.ZERO)>0&&obj.compareTo(new BigDecimal(1))<0){
            return "0"+df.format(obj).toString();
        }else {
            return df.format(obj).toString();
        }
    }

        System.out.println(formatToNumber(new BigDecimal("3.435")));
        System.out.println(formatToNumber(new BigDecimal(0)));
        System.out.println(formatToNumber(new BigDecimal("0.00")));
        System.out.println(formatToNumber(new BigDecimal("0.001")));
        System.out.println(formatToNumber(new BigDecimal("0.006")));
        System.out.println(formatToNumber(new BigDecimal("0.206")));

/**
 * 3.44
 * 0.00
 * 0.00
 * 0.00
 * 0.01
 * 0.21
 */

五、BigDecimal总结

5.1、注意点

需要精确的小数计算时在使用BigDecimal的性能比double和float差,在处理庞大,复杂的运算时尤为明显。故一般精度的计算没必要使用BigDecimal。

尽量使用参数类型为String的构造函数

BigDecimal都是不可变的(immutable)的,在进行每一次四则运算时,都会产生一个新的对象,所以在做加减乘除运算时要记得保存操作后的值

BigDecimal

上一篇:XML:XML约束


下一篇:MUX VLAN