package com.jingewenku.abrahamcaijin.commonutil; import java.math.BigDecimal; /** * 主要功能: 资金运算工具类 * @Prject: CommonUtilLibrary * @Package: com.jingewenku.abrahamcaijin.commonutil * @author: AbrahamCaiJin * @date: 2017年05月03日 16:37 * @Copyright: 个人版权所有 * @Company: * @version: 1.0.0 */ public class AppBigDecimal { private static final int DEF_DIV_SCALE = 10; /** * 提供精确的加法运算 * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算 * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double substract(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double multiply(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时, * 精确到小数点以后10位,以后的数字四舍五入. * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double divide(double v1, double v2) { return divide(v1, v2, DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算. * 当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入. * * @param v1 被除数 * @param v2 除数 * @param scale 表示需要精确到小数点以后几位 * @return 两个参数的商 */ public static double divide(double v1, double v2, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理 * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v, int scale) { if (scale < 0) { throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 金额分割,四舍五人金额 * @param s * @return */ public static String formatMoney(BigDecimal s){ String retVal = ""; String str = ""; boolean is_positive_integer = false; if(null == s){ return "0.00"; } if(0 == s.doubleValue()){ return "0.00"; } //判断是否正整数 if(s.toString().indexOf("-") != -1){ is_positive_integer = true; }else{ is_positive_integer = false; } //是负整数 if(is_positive_integer){ //去掉 - 号 s = new BigDecimal(s.toString().substring(1, s.toString().length())); } str = s.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); StringBuffer sb = new StringBuffer(); String[] strs = str.split("\\."); int j = 1; for(int i = 0; i < strs[0].length(); i++){ char a = strs[0].charAt(strs[0].length()-i-1); sb.append(a); if(j % 3 == 0 && i != strs[0].length()-1){ sb.append(","); } j++; } String str1 = sb.toString(); StringBuffer sb1 = new StringBuffer(); for(int i = 0; i < str1.length(); i++){ char a = str1.charAt(str1.length()-1-i); sb1.append(a); } sb1.append("."); sb1.append(strs[1]); retVal = sb1.toString(); if(is_positive_integer){ retVal = "-" + retVal; } return retVal; } /** * 四舍五人金额 * @param s * @return */ public static String formatMoney1(BigDecimal s){ String retVal = ""; String str = ""; boolean is_positive_integer = false; if(null == s){ return "0.00"; } if(0 == s.doubleValue()){ return "0.00"; } //判断是否正整数 if(s.toString().indexOf("-") != -1){ is_positive_integer = true; }else{ is_positive_integer = false; } //是负整数 if(is_positive_integer){ //去掉 - 号 s = new BigDecimal(s.toString().substring(1, s.toString().length())); } str = s.setScale(2, BigDecimal.ROUND_HALF_UP).toString(); StringBuffer sb = new StringBuffer(); String[] strs = str.split("\\."); int j = 1; for(int i = 0; i < strs[0].length(); i++){ char a = strs[0].charAt(strs[0].length()-i-1); sb.append(a); if(j % 3 == 0 && i != strs[0].length()-1){ sb.append(""); } j++; } String str1 = sb.toString(); StringBuffer sb1 = new StringBuffer(); for(int i = 0; i < str1.length(); i++){ char a = str1.charAt(str1.length()-1-i); sb1.append(a); } sb1.append("."); sb1.append(strs[1]); retVal = sb1.toString(); if(is_positive_integer){ retVal = "-" + retVal; } return retVal; } /** * @param amount 输入的数值 * @param compare 被比较的数字 * @return true 大于被比较的数 */ public static Boolean compareBigDecimal(String amount , double compare){ BigDecimal lenth=new BigDecimal(amount); if(lenth.compareTo(BigDecimal.valueOf(compare))==-1){ return false; } return true; } public static void main(String[] args) { System.out.println("金额0: " + formatMoney1(new BigDecimal(0))); System.out.println("金额0.0 : " + formatMoney1(new BigDecimal(0.0))); System.out.println("金额0.00: " + formatMoney1(new BigDecimal(0.00))); System.out.println("金额0.58: " + formatMoney1(new BigDecimal(0.58))); System.out.println("金额5.58: " + formatMoney1(new BigDecimal(5.58))); System.out.println("金额5.54: " + formatMoney1(new BigDecimal(5.54))); System.out.println("金额512322.555555111: " + formatMoney1(new BigDecimal(512322.555555111))); System.out.println("金额3423423425.54: " + formatMoney1(new BigDecimal(3423423425.54))); System.out.println("金额3423423425.58: " + formatMoney1(new BigDecimal(3423423425.58))); System.out.println("金额1000000.543453: " + formatMoney1(new BigDecimal(1000000.543453))); System.out.println("金额9343788754.573453: " + formatMoney1(new BigDecimal(-9343788754.573453))); System.out.println("金额9343788756.577: " + formatMoney1(new BigDecimal(-9343788756.577))); System.out.println("金额-343788756.577: " + formatMoney1(new BigDecimal(-343788756.577))); System.out.println("金额-34756.54: " + formatMoney1(new BigDecimal(-34756.54))); System.out.println("金额-34756.556: " + formatMoney1(new BigDecimal(-34756.556))); //DateUtils.rollDay(new Date(), -15); //直接使用浮点数进行计算,得到的结果是有问题的 //System.out.println(0.01 + 0.05); //使用了BigDecimal类进行计算后,可以做到精确计算 //System.out.println(BigDecimalMoney.add(0.0000000000005, 0.00000001)); } }