JAVA中精确计算⾦额BigDecimal package com.chauvet.utils;
import java.math.BigDecimal;
DecimalFormat;
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
*
bigdecimal格式化两位小数*/
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 String());
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 String(val1)).add(new String(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 String(val1)).subtract(new String(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 String(val1)).multiply(new String(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){
if(null == val2 || val2 == 0){
val2 = new Double(1);
}
return new String(val1)).divide(new String(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 String(val1)).divideAndRemainder(new String(val2)))[1].setScale(scale, BigDecimal.ROUND_HALF_UP).intValue(); }
/***
* 格式化Double类型数据
*
* @param val
* @param fmt
* NumberFormat currency = CurrencyInstance(); //建⽴货币格式化引⽤
* NumberFormat percent = PercentInstance(); //建⽴百分⽐格式化引⽤
* @param maximumFractionDigits
* 如果是百分⽐设置⼩数位数(四舍五⼊)
* @return
*/
public static String formatByNumberFormat(Double val,NumberFormat fmt,int maximumFractionDigits){
if(fmt.PercentInstance())){
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)pareTo(new BigDecimal(val2));
}
public static void main(String[] args) {
// System.out.2Double(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.divideAndRemainder(43D, 8D,0));
// System.out.println(AmountUtil.formatByNumberFormat(0.123456, PercentInstance(),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
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论