Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中若需要精确的计算结果则要用java.math.BigDecimal类。
BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
很多人可能觉得那输出结果不就是1.22嘛,可实际结果呢?
正确输出 :1.2199999999999999733546474089962430298328399658203125既然是精确的大数类实现,它自然会有自己的特别之处,下来看看JDK的解释:
上面讲解了BigDecimal的用法,下面再介绍常用的几种对BigDecimal进行格式化的方法
由于NumberFormat类的format()方法可以使用BigDecimal对象作为其参数,可以利用BigDecimal对超出16位有效数字的货币值,百分值,以及一般数值进行格式化控制。
以利用BigDecimal对货币和百分比格式化为例。首先,创建BigDecimal对象,进行BigDecimal的算术运算后,分别建立对货币和百分比格式化的引用,最后利用BigDecimal对象作为format()方法的参数,输出其格式化的货币值和百分比。
public static void main(String[] args) { NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用 NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用 percent.setMaximumFractionDigits(3); //百分比小数点最多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)); }
下面介绍如何对BigDecimal进行比较大小
publicstaticvoidmain(String[]args){ BigDecimala=newBigDecimal("1"); BigDecimalb=newBigDecimal("2"); BigDecimalc=newBigDecimal("1"); intresult1=a.compareTo(b); intresult2=a.compareTo(c); intresult3=b.compareTo(a); System.out.println(result1); System.out.println(result2); System.out.println(result3); }
即左边比右边数大,返回1,相等返回0,比右边小返回-1。注意 不可用equals进行相等的判断,equals 比较是两个BigDecimal对象的地址。