其它資源: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
}
}