• 处理浮点数的工具类


    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
  • 相关阅读:
    今天 弄了一下ajax 里面的
    重修理解了一下js 控制treeview 菜单的子级和父级的关系 理解的还不够全 因为 html不够全 但是加个注释吧
    xml .net 用法
    这几天在做把数据库里的数据 导出 并且压缩 学到了一些东西
    今天实现了用按钮后台动态实现了 table里面内容的显示和隐藏 在实现过程中了解了updatepanel的简单的用法
    今天第一次参加了软件产品的讨论会议 收获
    收藏个debug的文章
    Animate.css
    flash遨游缓存问题
    URL短地址压缩算法 微博短地址原理解析 (Java实现)
  • 原文地址:https://www.cnblogs.com/gaopengfirst/p/9450837.html
Copyright © 2020-2023  润新知