1、在要求结果精确的商业计算中,尽量使用BigDecimal,float和double类型的主要设计目标是为了科学计算和工程计算,他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。使用BigDecimal并且一定要用String来构造。为什么不能使用Float和Double作精准的商业计算,举个例子:

0.060000000000000005;

为什么不是0.06呢?其实这涉及到计算机存储问题,因为计算机并不识别除二进制以外的其他任何数据,所以是编译器进行计算的时候,首先会计算0.05的二进制表示,为0.00001100110011001100110011001100110011001100110011001101,其次为0.01的二进制表示为0.00000010100011110101110000101000111101011100001010001111011,然后相加,最后再转换为十进制,最后结果为0.060000000000000005,而不是0.06.

那么如何在计算中得到想要的0.06呢?可以使用java.math.Bigdecimal类中的BigDecimal,它支持任何精度的定点数,也可以用于精确的计算货币值。

2、BigDecimal的使用

它总共有四个构造方法

  • BigDecimal(int) 创建一个具有参数所指定整数值的对象。
  • BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
  • BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
  • BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。

建议基于以上两种构建构造函数

小数的构造函数可以如下BigDecimal("0.01") 或 BigDecimal(1, 2) 构造 BigDecimal ,这两种方法都可以精确的表示小数

BigDecimal支持以下计算方式:

  • BigDecimal add(BigDecimal augend) 加法运算                                                                                          如:BigDecimal b1 = new BigDecimal(Double.toString(v1));  
            BigDecimal b2 = new BigDecimal(Double.toString(v2));  
            return b1.add(b2).doubleValue();  
  • BigDecimal subtract(BigDecimal subtrahend) 减法运算
  • BigDecimal multiply(BigDecimal multiplicand) 乘法运算
  • BigDecimal divide(BigDecimal divisor) 除法运算

BigDecimal小数位的取值

BigDecimal a= new BigDecimal("1.35");

对数值取值:

1.a.setScale(1,BigDecimal.ROUND_DOWN);

    取一位小数,直接删除后面多余位数,故取值1.3.

2.a.setScale(1,BigDecimal.ROUND_UP);

    取一位小数,删除后面位数,进一位,故取值1.4.

3.a.setScale(1,BigDecimal.ROUND_HALF_UP);

    取一位小数,四舍五入,故取值1.4.

4.a.setScale(1,BigDecimal.ROUND_HALF_DOWN);

    取一位小数,四舍五入,但是5也是舍弃,故取值1.3.

BigDecimal的比等方法

    equals() 方法认为,两个表示同一个数但换算值不同(例如, 100.00 和 100.000 )的 BigDecimal 值是不相等的。然而, compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()

3、Numberformat格式化使用

BigDecimal bigLoanAmount = new BigDecimal("12.11");  
 
 BigDecimal bigInterestRate = new BigDecimal("1.15");  
 
 NumberFormat currency = NumberFormat.getCurrencyInstance();    //建立货币格式化引用  
 
 NumberFormat currency2 = NumberFormat.getCurrencyInstance(Locale.US);//建立美元格式引用
 
 NumberFormat percent = NumberFormat.getPercentInstance();     //建立百分比格式化用  
 
 percent.setMaximumFractionDigits(3);               //百分比小数点最多3位  
 
 System.out.println(currency.format(bigLoanAmount)); 结果:¥12.11
 
 System.out.println(currency2.format(bigLoanAmount)); 结果:$12.11 
 
System.out.println(percent.format(bigInterestRate)); 结果:115%