其它资源:http://blog.csdn.net/lhooouuu/article/details/7086880
在金额的计算中需要精确计算,而double肯定是不行的。BigDecimal的计算中也要注意一些问题。看案例:
import java.math.BigDecimal;
import java.text.NumberFormat;
import org.junit.Test;
/**
* BigDecimal的加减乘除 注意的问题
* new BigDecimal(String val ) ; new BigDecimal(double val )
* 为了防止精度出现偏离,建议使用参数为String类型的该构造方法。(见 test3)
* @author Administrator
*
*/
public class BigDecimalYunSuan {
/**
* double类运算出现的问题
*/
@Test
public void test1(){
System.out.println(0.05+0.01); //0.060000000000000005
System.out.println(1.0 - 0.42); //0.5800000000000001
System.out.println(4.015 * 100); //401.49999999999994
System.out.println(123.3 / 100); //1.2329999999999999
//自动科学计数法
System.out.println(9969999999.04); //9.96999999904E9
System.out.println(199999999.04); //1.9999999904E8
System.out.println(1000000011.01); //1.00000001101E9
System.out.println(9999999.04); //9999999.04
}
/**
* BigDecimal赋值出现的问题
*/
@Test
public void test2(){
BigDecimal a = new BigDecimal(123456789.01);
BigDecimal b = new BigDecimal("123456789.01");
System.out.println(a); //123456789.01000000536441802978515625
System.out.println(b); //123456789.01
}
/**
* 除法一定要保留小数
*/
@Test
public void test3(){
//正确结果应该=17.1768
BigDecimal a = new BigDecimal(10.53);
BigDecimal b = new BigDecimal(6.6468);
BigDecimal add = a.add(b); // +
BigDecimal subtract = a.subtract(b); // -
BigDecimal multiply = a.multiply(b); // *
BigDecimal divide = a.divide(b,2,BigDecimal.ROUND_HALF_UP); // /
System.out.println(add); //17.176799999999999180...
System.out.println(subtract); //3.8831999999999995409...
System.out.println(multiply); //69.990803999999993849...
System.out.println(divide); //1.58
BigDecimal a1 = new BigDecimal("10.53");
BigDecimal b1 = new BigDecimal("6.6468");
BigDecimal add1 = a1.add(b1); // +
BigDecimal subtract1 = a1.subtract(b1); // -
BigDecimal multiply1 = a1.multiply(b1); // *
BigDecimal divide1 = a1.divide(b1,2,BigDecimal.ROUND_HALF_UP); // /
System.out.println(add1); //17.1768
System.out.println(subtract1); //3.8832
System.out.println(multiply1); //69.990804
System.out.println(divide1); //1.58
}
/**
* 格式化数值
*/
@Test
public void test4(){
double format = 12343171.6;
//获取常规数值格式
NumberFormat number = NumberFormat.getNumberInstance();
String str = number.format(format);//12,343,171.6
System.out.println(str);
//获取整数数值格式
NumberFormat integer = NumberFormat.getIntegerInstance();
str = integer.format(format);//如果带小数会四舍五入到整数12,343,172
System.out.println(str);
//获取货币数值格式
NumberFormat currency = NumberFormat.getCurrencyInstance();
currency.setMinimumFractionDigits(2);//设置数的小数部分所允许的最小位数(如果不足后面补0)
currency.setMaximumFractionDigits(4);//设置数的小数部分所允许的最大位数(如果超过会四舍五入)
str = currency.format(format);//¥12,343,171.60
System.out.println(str);
//获取显示百分比的格式
NumberFormat percent = NumberFormat.getPercentInstance();
percent.setMinimumFractionDigits(2);//设置数的小数部分所允许的最小位数(如果不足后面补0)
percent.setMaximumFractionDigits(3);//设置数的小数部分所允许的最大位数(如果超过会四舍五入)
str = percent.format(format);//1,234,317,160.00%
System.out.println(str);
}
/**
* 保留小数
*/
@Test
public void test5() {
BigDecimal num1 = new BigDecimal("6.6468");
BigDecimal num2 = new BigDecimal("-6.6468");
// 四舍五入
System.out.println(num1.setScale(2, BigDecimal.ROUND_HALF_UP)); // 6.65
System.out.println(num2.setScale(2, BigDecimal.ROUND_HALF_UP)); // -6.65
System.out.println("-----------");
System.out.println(num1.setScale(2, BigDecimal.ROUND_DOWN)); // 6.64
System.out.println(num2.setScale(2, BigDecimal.ROUND_DOWN)); // -6.64
System.out.println("-----------");
System.out.println(num1.setScale(2, BigDecimal.ROUND_FLOOR)); // 6.64
System.out.println(num2.setScale(2, BigDecimal.ROUND_FLOOR)); // -6.65
System.out.println("-----------");
System.out.println(num1.setScale(2, BigDecimal.ROUND_FLOOR)); // 6.64
System.out.println(num2.setScale(2, BigDecimal.ROUND_FLOOR)); // -6.65
}
}