处理浮点数的工具类

package demo.springboot.web;/** * Created with IntelliJ IDEA. * User: gaopeng * Date: 2018/8/9 0009 * Time: 17:13 * Description: */import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import java.math.BigDecimal;import java.text.DecimalFormat;import java.text.ParseException;public class DecimalCalculate{    /**     * 因为Java的简单类型不可以精确的对浮点数进行运算,这个工具类提供精     * 确的浮点数运算,包括加减乘除和四舍五入。     *///默认除法运算精度    private static final int DEF_DIV_SCALE = 10;    private static Log logger = LogFactory.getLog(DecimalCalculate.class);    //这个类不能实例化    private DecimalCalculate(){    }    /**     * 提供精确的加法运算。     * @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 sub(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 mul(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 div(double v1,double v2){        return div(v1,v2,DEF_DIV_SCALE);    }    /**     * 提供(相对)精确的除法运算。当发生除不尽的状况时,由scale参数指     * 定精度,之后的数字四舍五入。     * @param v1 被除数     * @param v2 除数     * @param scale 表示表示须要精确到小数点之后几位。     * @return 两个参数的商     */    public static double div(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();    }    /**     * 提供精确的类型转换(Float)     * @param v 须要被转换的数字     * @return 返回转换结果     */    public static float convertsToFloat(double v){        BigDecimal b = new BigDecimal(v);        return b.floatValue();    }    /**     * 提供精确的类型转换(Int)不进行四舍五入     * @param v 须要被转换的数字     * @return 返回转换结果     */    public static int convertsToInt(double v){        BigDecimal b = new BigDecimal(v);        return b.intValue();    }    /**     * 提供精确的类型转换(Long)     * @param v 须要被转换的数字     * @return 返回转换结果     */    public static long convertsToLong(double v){        BigDecimal b = new BigDecimal(v);        return b.longValue();    }    /**     * 返回两个数中大的一个值     * @param v1 须要被对比的第一个数     * @param v2 须要被对比的第二个数     * @return 返回两个数中大的一个值     */    public static double returnMax(double v1,double v2){        BigDecimal b1 = new BigDecimal(v1);        BigDecimal b2 = new BigDecimal(v2);        return b1.max(b2).doubleValue();    }    /**     * 返回两个数中小的一个值     * @param v1 须要被对比的第一个数     * @param v2 须要被对比的第二个数     * @return 返回两个数中小的一个值     */    public static double returnMin(double v1,double v2){        BigDecimal b1 = new BigDecimal(v1);        BigDecimal b2 = new BigDecimal(v2);        return b1.min(b2).doubleValue();    }    /**     * 精确对比两个数字     * @param v1 须要被对比的第一个数     * @param v2 须要被对比的第二个数     * @return 若是两个数同样则返回0,若是第一个数比第二个数大则返回1,反之返回-1     */    public static int compareTo(double v1,double v2){        BigDecimal b1 = new BigDecimal(v1);        BigDecimal b2 = new BigDecimal(v2);        return b1.compareTo(b2);    }    /**     * 初始金额格式     */    public static String MONEY_PATTERN = "#,##0.00#";    /**     * 初始数字格式     */    public static String FLOAT_PATTERN = "#0.0########################";    /**     * 格式化金额(千分位)     * @param numStr     * @return     * @author mshi     */    public static final double parseMoney(String numStr) {        return parse(numStr, MONEY_PATTERN);    }    /**     * 格式化数字     * @param numStr     * @return     * @author mshi     */    public static final double parseNumber(String numStr) {        return parse(numStr, FLOAT_PATTERN);    }    /**     * 格式化     * @param numStr     * @param pattern 格式     * @return     * @author mshi     */    public static final double parse(String numStr, String pattern) {        double decimal = 0;        try {            DecimalFormat decFmt = new DecimalFormat(pattern);            decimal = decFmt.parse(numStr).doubleValue();        } catch (ParseException e) {            logger.error("parse(String) parse error", e);        }        return decimal;    }    /**     * 格式化金额(千分位)     * @param     * @return     * @author mshi     */    public static final String formatMoney(double decimal) {        return format(decimal, MONEY_PATTERN);    }    /**     * 格式化数字     * @param     * @return     * @author mshi     */    public static final String formatNumber(double decimal) {        return format(decimal, FLOAT_PATTERN);    }    /**     * 格式化金额     * @param     * @param pattern 格式     * @return     * @author mshi     */    public static final String format(double decimal, String pattern) {        DecimalFormat decFmt = new DecimalFormat(pattern);        return decFmt.format(decimal);    }}参考地址:https://blog.csdn.net/dingqinghu/article/details/46608863      https://blog.csdn.net/ccecwg/article/details/41822367
相关文章
相关标签/搜索