不管身处何种行业,金融,p2p,银行各种行业离不开java的加 减 乘 除,那么这里我给出你最完美的答案。
package dxt.loan.util;
import java.math.BigDecimal; import java.math.RoundingMode; import com.dxcc.common.exception.PublicBOExHandler; import com.dxcc.common.util.StringUtil; public class MoneyUtil { /** * 舍入模式 */ public enum RoundingType { /** * 向正无限大方向舍入的舍入模式。(取顶) */ CEILING(RoundingMode.CEILING) /** * 向零方向舍入的舍入模式。 */ , DOWN(RoundingMode.DOWN) /** * 向负无限大方向舍入的舍入模式。(取底) */ , FLOOR(RoundingMode.FLOOR) /** * 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。 */ , HALF_DOWN(RoundingMode.HALF_DOWN) /** * 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 */ , HALF_EVEN(RoundingMode.HALF_EVEN) /** * 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。 (此舍入模式就是通常学校里讲的四舍五入) */ , HALF_UP(RoundingMode.HALF_UP) /** * 用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。 */ , UNNECESSARY(RoundingMode.UNNECESSARY) /** * 远离零方向舍入的舍入模式。 */ , UP(RoundingMode.UP); private RoundingMode roundingMode; private RoundingType(RoundingMode roundingMode) { this.roundingMode = roundingMode; } } /** * @作者: 王超 * @功能: 加 * @日期: 2015年1月26日 上午9:01:47 * @param addend * @param augend * @return */ public static String Add(String addend, String augend) { addend = StringUtil.KillEmptyAndNull(addend, "0.00"); augend = StringUtil.KillEmptyAndNull(augend, "0.00"); BigDecimal addendBd = new BigDecimal(addend); BigDecimal augendBd = new BigDecimal(augend); return addendBd.add(augendBd).toPlainString(); } /** * @作者: 王超 * @功能: 加 * @日期: 2015年1月26日 上午9:02:00 * @param addends * @return */ public static String Add(String... addends) { String sum = "0.00"; for (String addend : addends) { addend = StringUtil.KillEmptyAndNull(addend, "0.00"); sum = Add(addend, sum); } return sum; } /** * @作者: 王超 * @功能: 减 * @日期: 2015年1月26日 上午9:02:06 * @param subtrahend 减数 * @param minuend 被减数 * @return */ public static String subtract(String subtrahend, String minuend) { String result = "0.00"; try { subtrahend = StringUtil.KillEmptyAndNull(subtrahend, "0.00"); minuend = StringUtil.KillEmptyAndNull(minuend, "0.00"); BigDecimal subtrahendBd = new BigDecimal(subtrahend); BigDecimal minuendBd = new BigDecimal(minuend); result = subtrahendBd.subtract(minuendBd).toPlainString(); } catch (Exception e) { e.printStackTrace(); new PublicBOExHandler().handle(e); } return result; } /** * 方法描述:负数时发回0 * * @param num * @param num1 * @return String * @author 栾好威 * @date 2016-1-14 下午7:03:08 */ public static String subtractReturnZero(String num, String num1) { String result = "0"; try { result = subtract(num, num1); if (compareToNumeral(result, "0") == -1) { result = "0"; } } catch (Exception e) { e.printStackTrace(); } return result; } /** * @名称 compareToNumeral * @描述 num1大于num2 返回 1;num1等于num2返回 0; num1小于num2 返回 -1;异常返回-2 * @参数 @param num1 * @参数 @param num2 * @参数 @return * @返回值 int * @作者 luanhaowei * @时间 Dec 12, 2011 8:43:14 PM */ public static int compareToNumeral(String num1, String num2) { int result = -2; result = StringUtil.isMore(num1.replace(",", ""), num2.replace(",", "")); return result; } /** * @作者: 王拥林 * @功能: 减 * @日期: 2015年3月20日 下午2点01分30s * @param subtrahend 减数 double * @param minuend 被减数 double * @return */ public static String subtract(double subtrahend, double minuend) { String result = "0.00"; try { BigDecimal subtrahendBd = new BigDecimal(subtrahend); BigDecimal minuendBd = new BigDecimal(minuend); result = subtrahendBd.subtract(minuendBd).toPlainString(); } catch (Exception e) { e.printStackTrace(); new PublicBOExHandler().handle(e); } return result; } /** * @功能: 乘 * @作者: 王超 * @日期: 2015年1月26日 下午4:23:16 * @param multiplier 乘数 * @param multiplicand 被乘数 * @param roundingType 舍入方式(为null时默认四舍五入) * @return */ public static String multiply(String multiplier, String multiplicand, RoundingType roundingType) { roundingType = roundingType == null ? RoundingType.HALF_UP : roundingType; multiplier = StringUtil.KillEmptyAndNull(multiplier, "0.00"); multiplicand = StringUtil.KillEmptyAndNull(multiplicand, "0.00"); BigDecimal multiplierBd = new BigDecimal(multiplier); BigDecimal multiplicandBd = new BigDecimal(multiplicand); return multiplierBd.multiply(multiplicandBd).toPlainString(); } /** * @作者: 王超 * @功能: 除 * @日期: 2015年1月26日 上午9:02:25 * @param divisor 除数 * @param dividend 被除数 * @param scale 保留小数位数 * @param roundingType 舍入方式(为null时默认四舍五入) * @return */ public static String divide(String divisor, String dividend, int scale, RoundingType roundingType) { roundingType = roundingType == null ? RoundingType.HALF_UP : roundingType; divisor = StringUtil.KillEmptyAndNull(divisor, "0.00"); dividend = StringUtil.KillEmptyAndNull(dividend, "0.00"); if (StringUtil.isMore(dividend, "0.00") == 0) { // 0不能做除数,0除以1是为了保证返回指定位数的小数 return new BigDecimal("0").divide(new BigDecimal("1"), scale, roundingType.roundingMode).toPlainString(); } BigDecimal divisorBd = new BigDecimal(divisor); BigDecimal dividendBd = new BigDecimal(dividend); return divisorBd.divide(dividendBd, scale, roundingType.roundingMode).toPlainString(); } /** * @作者: 王超 * @功能: 舍入小数 * @日期: 2015年1月26日 上午9:02:35 * @param num 需要舍入小数的数字 * @param scale 保留小数位数 * @param roundingType 舍入方式(为null时默认四舍五入) * @return */ public static String toFixed(String num, int scale, RoundingType roundingType) { roundingType = roundingType == null ? RoundingType.HALF_UP : roundingType; num = StringUtil.KillEmptyAndNull(num, "0.00"); return new BigDecimal(num).divide(new BigDecimal("1"), scale, roundingType.roundingMode).toPlainString(); } /** * @作者: 王超 * @功能: 金额比较 * @日期: 2015年1月26日 上午9:03:05 * @param num1 * @param num2 * @return -1(num1 < num2), 0(num1 = num2), 1(num1 > num2) */ public static int compareTo(String num1, String num2) { num1 = StringUtil.KillEmptyAndNull(num1, "0.00"); num2 = StringUtil.KillEmptyAndNull(num2, "0.00"); BigDecimal num1Bd = new BigDecimal(num1); BigDecimal num2Bd = new BigDecimal(num2); return num1Bd.compareTo(num2Bd); } public static void main(String[] args){ String s1=MoneyUtil.Add(new String[]{"1001921.1111","111","333"}); System.out.println(s1); } }