JAVA中精確計算金額BigDecimal


package com.chauvet.utils;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/***
* 
* 金額
* 
* 如果需要精確計算,必須用String來夠造BigDecimal! !!
* 
* Java里面的商業計算,不能用float和double,因為他們無法 進行精確計算。
* 但是Java的設計者給編程人員提供了一個很有用的類BigDecimal,
* 他可以完善float和double類無法進行精確計算的缺憾。
* BigDecimal類位於java.maths類包下。
* 它的構造函數很多,最常用的:
* BigDecimal(double val)
* BigDecimal(String str)
* BigDecimal(BigInteger val)
* BigDecimal(BigInteger unscaledVal, int scale)

*
* @author wxw
*
*/
public class AmountUtil {

/***
* 保留2位小數
* 四舍五入
* @param a
* 
* @return
* 返回一個double類型的2位小數
*/
public static Double get2Double(Double doubleVal,int scale){
if(null == doubleVal){
doubleVal = new Double(0);
}
return new BigDecimal(doubleVal).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/***
* 格式化Double類型並保留scale位小數
* 四舍五入
* @param doubleVal
* @param scale
* scale必須為大於0的正整數,不能等於0
* @return
*/
public static String formatBy2Scale(Double doubleVal,int scale){
if(null == doubleVal){
doubleVal = new Double(0);
}
StringBuffer sbStr = new StringBuffer("0.");
for (int i = 0; i < scale; i++) {
sbStr.append("0");
}
DecimalFormat myformat = new DecimalFormat(sbStr.toString());
return myformat.format(doubleVal);
}

/***
* Double類型相加 <font color="red">+</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
* 
* @param val2
* 
* @param scale
* <font color="red">保留scale位小數</font><br/>
* @return
*/
public static Double add(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(Double.toString(val1)).add(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/***
* Double類型相減 <font color="red">—</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
* 
* @param val2
* 
* @param scale
* <font color="red">保留scale位小數</font><br/>
* @return
*/
public static Double subtract(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(Double.toString(val1)).subtract(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/***
* Double類型相乘 <font color="red">*</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
* 
* @param val2
* 
* @param scale
* <font color="red">保留scale位小數</font><br/>
* @return
*/
public static Double multiply(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(Double.toString(val1)).multiply(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

/***
* Double類型相除 <font color="red">/</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
* 
* @param val2
* 
* @param scale
* <font color="red">保留scale位小數</font><br/>
* @return
*/
public static Double divide(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2 || val2 == 0){
val2 = new Double(1);
}
return new BigDecimal(Double.toString(val1)).divide(new BigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}


/***
* Double類型取余    <font color="red">%</font><br/>
* ROUND_HALF_UP <font color="red">四舍五入</font><br/>
* @param val1
* 
* @param val2
* 
* @param scale
* <font color="red">保留scale位小數</font><br/>
* @return
*/
public static int divideAndRemainder(Double val1,Double val2,int scale){
if(null == val1){
val1 = new Double(0);
}
if(null == val2 || val2 == 0){
val2 = new Double(1);
}
return new BigDecimal(Double.toString(val1)).divideAndRemainder(new BigDecimal(Double.toString(val2)))[1].setScale(scale, BigDecimal.ROUND_HALF_UP).intValue();
}

/***
* 格式化Double類型數據
* 
* @param val
* @param fmt
* NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立貨幣格式化引用 
* NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用 
* @param maximumFractionDigits
* 如果是百分比 設置小數位數(四舍五入)
* @return
*/
public static String formatByNumberFormat(Double val,NumberFormat fmt,int maximumFractionDigits){
if(fmt.equals(NumberFormat.getPercentInstance())){
fmt.setMaximumFractionDigits(maximumFractionDigits); //百分比小數點最多3位 
}
return fmt.format(val);

}

/***
* 比較大小
* -1、0、1,即左邊比右邊數大,返回1,相等返回0,比右邊小返回-1。
* @param doubleVal
* @return
*/
public static int compareTo(Double val1,Double val2){
if(null == val1){
val1 = new Double(0);
}
if(null == val2){
val2 = new Double(0);
}
return new BigDecimal(val1).compareTo(new BigDecimal(val2));
}


public static void main(String[] args) {

//    System.out.println(AmountUtil.get2Double(null,3));
//    System.out.println(AmountUtil.add(12.2155, null,4));
//    System.out.println(AmountUtil.subtract(12.2155, 1D,2));
//    System.out.println(AmountUtil.multiply(12.2155, 2D,2));
//    System.out.println(AmountUtil.divide(44.13, 2D,2));
//    System.out.println(AmountUtil.divideAndRemainder(43D, 8D,0));
//    System.out.println(AmountUtil.formatByNumberFormat(0.123456, NumberFormat.getPercentInstance(),3));
//    System.out.println(AmountUtil.formatBy2Scale(12.23457,3));


DecimalFormat df = new DecimalFormat("0.00\u2030"); //"\u2030"表示乘以1000並顯示為千分數
System.out.println(df.format(12.1233)); //8-->1234567.89‰ 

df = new DecimalFormat("0,000.0#");//在數字中添加逗號
System.out.println(df.format(123456789.12345)); //5-->-1,234.57 


df = new DecimalFormat("0");//不保留小數點 四舍五入
System.out.println(df.format(123456789.9876)); //5-->-1,234.57 
}
}
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM