packagecom.chauvet.utils;importjava.math.BigDecimal;importjava.text.DecimalFormat;importjava.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)
*
*@authorwxw
**/
public classAmountUtil {/***
* 保留2位小数
* 四舍五入
*@parama
*
*@return* 返回一个double类型的2位小数*/
public static Double get2Double(Double doubleVal,intscale){if(null ==doubleVal){
doubleVal= new Double(0);
}return newBigDecimal(doubleVal).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}/***
* 格式化Double类型并保留scale位小数
* 四舍五入
*@paramdoubleVal
*@paramscale
* scale必须为大于0的正整数,不能等于0
*@return
*/
public static String formatBy2Scale(Double doubleVal,intscale){if(null ==doubleVal){
doubleVal= new Double(0);
}
StringBuffer sbStr= new StringBuffer("0.");for (int i = 0; i < scale; i++) {
sbStr.append("0");
}
DecimalFormat myformat= newDecimalFormat(sbStr.toString());returnmyformat.format(doubleVal);
}/***
* Double类型相加 +
* ROUND_HALF_UP 四舍五入
*@paramval1
*
*@paramval2
*
*@paramscale
* 保留scale位小数
*@return
*/
public static Double add(Double val1,Double val2,intscale){if(null ==val1){
val1= new Double(0);
}if(null ==val2){
val2= new Double(0);
}return new BigDecimal(Double.toString(val1)).add(newBigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}/***
* Double类型相减 —
* ROUND_HALF_UP 四舍五入
*@paramval1
*
*@paramval2
*
*@paramscale
* 保留scale位小数
*@return
*/
public static Double subtract(Double val1,Double val2,intscale){if(null ==val1){
val1= new Double(0);
}if(null ==val2){
val2= new Double(0);
}return new BigDecimal(Double.toString(val1)).subtract(newBigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}/***
* Double类型相乘 *
* ROUND_HALF_UP 四舍五入
*@paramval1
*
*@paramval2
*
*@paramscale
* 保留scale位小数
*@return
*/
public static Double multiply(Double val1,Double val2,intscale){if(null ==val1){
val1= new Double(0);
}if(null ==val2){
val2= new Double(0);
}return new BigDecimal(Double.toString(val1)).multiply(newBigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}/***
* Double类型相除 /
* ROUND_HALF_UP 四舍五入
*@paramval1
*
*@paramval2
*
*@paramscale
* 保留scale位小数
*@return
*/
public static Double divide(Double val1,Double val2,intscale){if(null ==val1){
val1= new Double(0);
}if(null == val2 || val2 == 0){
val2= new Double(1);
}return new BigDecimal(Double.toString(val1)).divide(newBigDecimal(Double.toString(val2))).setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}/***
* Double类型取余 %
* ROUND_HALF_UP 四舍五入
*@paramval1
*
*@paramval2
*
*@paramscale
* 保留scale位小数
*@return
*/
public static int divideAndRemainder(Double val1,Double val2,intscale){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类型数据
*
*@paramval
*@paramfmt
* NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
* NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
*@parammaximumFractionDigits
* 如果是百分比 设置小数位数(四舍五入)
*@return
*/
public static String formatByNumberFormat(Double val,NumberFormat fmt,intmaximumFractionDigits){if(fmt.equals(NumberFormat.getPercentInstance())){
fmt.setMaximumFractionDigits(maximumFractionDigits);//百分比小数点最多3位
}returnfmt.format(val);
}/***
* 比较大小
* -1、0、1,即左边比右边数大,返回1,相等返回0,比右边小返回-1。
*@paramdoubleVal
*@return
*/
public static intcompareTo(Double val1,Double val2){if(null ==val1){
val1= new Double(0);
}if(null ==val2){
val2= new Double(0);
}return new BigDecimal(val1).compareTo(newBigDecimal(val2));
}public static voidmain(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
}
}