Android 关于数据处理的工具类

很长时间没发干货了,直接来点干货。

本文主要针对String 类型的数字简单运算如加、减、乘、除 以及大小比较等。

废话不多说直接上代码

public class NumberUtils {
    /**
     * 格式化为指定位小数的数字,返回未使用科学计数法表示的具有指定位数的字符串。
     * 该方法舍入模式:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
     * <pre>
     *     "3.1415926", 1       --> 3.1
     *     "3.1415926", 3       --> 3.142
     *     "3.1415926", 4       --> 3.1416
     *     "3.1415926", 6       --> 3.141593
     *     "1234567891234567.1415926", 3  --> 1234567891234567.142
     * </pre>
     *
     * @param number    String类型的数字对象
     * @param precision 小数精确度总位数,如2表示两位小数

     * @return 返回数字格式化后的字符串表示形式(注意返回的字符串未使用科学计数法)
     */
    public static String keepPrecision(String number, int precision) {
        return keepPrecision(number,precision,true);
    }

    /**
     * @param isNeedDealEndWithZero 是否需要处理小数点后的0
     * @return
     */
    public static String keepPrecision(String number, int precision,boolean isNeedDealEndWithZero) {
        if (TextUtils.isEmpty(number)) {
            number = "0";
        }
        BigDecimal bg = new BigDecimal(number);
        String s = bg.setScale(precision, BigDecimal.ROUND_HALF_UP).toPlainString();
        if (isNeedDealEndWithZero) {
            if (!TextUtils.isEmpty(s)) {
                double v1 = Double.parseDouble(s);
                DecimalFormat decimalFormat = new DecimalFormat("###################.###########");
                s = decimalFormat.format(v1);

            }
        }
        return s;
    }

    /**
     * 格式化为指定位小数的数字,返回未使用科学计数法表示的具有指定位数的字符串。<br>
     * 该方法舍入模式:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。<br>
     * 如果给定的数字没有小数,则转换之后将以0填充;例如:int 123  1 --> 123.0<br>
     * <b>注意:</b>如果精度要求比较精确请使用 keepPrecision(String number, int precision)方法
     *
     * @param number    类型的数字对象
     * @param precision 小数精确度总位数,如2表示两位小数
     * @return 返回数字格式化后的字符串表示形式(注意返回的字符串未使用科学计数法)
     */
    public static String keepPrecision(Number number, int precision) {
        return keepPrecision(String.valueOf(number), precision);
    }

    /**
     * 对double类型的数值保留指定位数的小数。<br>
     * 该方法舍入模式:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。<br>
     * <b>注意:</b>如果精度要求比较精确请使用 keepPrecision(String number, int precision)方法
     *
     * @param number    要保留小数的数字
     * @param precision 小数位数
     * @return double 如果数值较大,则使用科学计数法表示
     */
    public static double keepPrecision(double number, int precision) {
        BigDecimal bg = new BigDecimal(number);
        return bg.setScale(precision, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static double keepPrecisionDown(double number, int precision) {
        BigDecimal bg = new BigDecimal(number);
        return bg.setScale(precision, BigDecimal.ROUND_HALF_DOWN).doubleValue();
    }

    /**
     * 对float类型的数值保留指定位数的小数。<br>
     * 该方法舍入模式:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。<br>
     * <b>注意:</b>如果精度要求比较精确请使用 keepPrecision(String number, int precision)方法
     *
     * @param number    要保留小数的数字
     * @param precision 小数位数
     * @return float 如果数值较大,则使用科学计数法表示
     */
    public static float keepPrecision(float number, int precision) {
        BigDecimal bg = new BigDecimal(number);
        return bg.setScale(precision, BigDecimal.ROUND_HALF_UP).floatValue();
    }

    /**
     * 不确定个数的数字加和
     *
     * @param precision 小数位数
     * @param num       String类型的数字对象
     * @return
     */
    public static String addDoubleNum(int precision, String... num) {
        return addDoubleNum(true,precision,num);
    }
    public static String addDoubleNum(boolean isNeedDealEndWithZero,int precision, String... num) {
        double result = 0;
        for (String i : num) {
            try {
                if (!TextUtils.isEmpty(i)) {
                    double parseDouble = Double.parseDouble(i);
                    result += parseDouble;
                }
            } catch (Exception e) {
                e.printStackTrace();
//                return "请填写数字";
            }
        }
        String s = keepPrecision(result+"", precision,isNeedDealEndWithZero);
        return s;

    }

    /**
     * 不确定个数的数字加和
     *
     * @param num String类型的数字对象
     * @return
     */
    public static String addIntNum(String... num) {
        double result = 0;
        for (String i : num) {
            try {
                if (!TextUtils.isEmpty(i)) {
                    double parseInt = Double.parseDouble(i);
                    result += parseInt;
                }
            } catch (Exception e) {
                e.printStackTrace();
                return "请填写数字";
            }
        }
        double v = keepPrecision(result, 0);

        return ((int) v) + "";
    }

    /**
     * 乘积
     *
     * @param precision 小数位数
     * @param num1      String类型的数字对象
     * @return
     */
    public static String productDoubleNum(int precision, String num1, String num2) {
        return productDoubleNum(true,precision,num1,num2);
    }
    public static String productDoubleNum(boolean isNeedDealEndWithZero,int precision, String num1, String num2) {
        double result = 0;

        try {
            if (!TextUtils.isEmpty(num1) && !TextUtils.isEmpty(num2)) {
                double parseDouble1 = Double.parseDouble(num1);
                double parseDouble2 = Double.parseDouble(num2);
                result = parseDouble1 * parseDouble2;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "请填写数字";
        }

        return keepPrecision(result+"", precision,isNeedDealEndWithZero) ;
    }

    /**
     * 判断大小
     *
     * @param num1 String类型的数字对象
     * @param num2 String类型的数字对象
     * @return num1小于等于 num2
     * isEqual 是否包含等于
     */
    public static boolean bigDoubleNum(String num1, String num2) {
        return bigDoubleNum(num1,num2,true);
    }
    public static boolean bigDoubleNum(String num1, String num2,boolean isEqual) {


        try {
            if (!TextUtils.isEmpty(num1) || !TextUtils.isEmpty(num2)) {
                if (TextUtils.isEmpty(num1)) {
                    num1 = "0";
                }
                if (TextUtils.isEmpty(num2)) {
                    num2 = "0";
                }
                double parseDouble1 = Double.parseDouble(num1);
                double parseDouble2 = Double.parseDouble(num2);
                if (isEqual) {
                    if (parseDouble1 <= parseDouble2) {
                        return true;
                    } else {
                        return false;
                    }
                }else {
                    if (parseDouble1 < parseDouble2) {
                        return true;
                    } else {
                        return false;
                    }
                }

            }
        } catch (Exception e) {
            e.printStackTrace();

        }
        return false;
    }

    /**
     * 判断等于
     *
     * @param num1 String类型的数字对象
     * @return
     */
    public static boolean EqualDoubleNum(String num1, String num2) {


        try {
            if (!TextUtils.isEmpty(num1)||!TextUtils.isEmpty(num2)) {
                if (TextUtils.isEmpty(num1)){
                    num1="0";
                }
                if (TextUtils.isEmpty(num2)){
                    num2="0";
                }
                double parseDouble1 = Double.parseDouble(num1);
                double parseDouble2 = Double.parseDouble(num2);
                if (parseDouble1 == parseDouble2) {
                    return true;
                } else {
                    return false;
                }

            }
        } catch (Exception e) {
            e.printStackTrace();

        }
        return false;
    }

    public static Integer strToInt(String str) {
        Integer integer = null;
        try {
            if (StringUtils.isEmpty(str)) {
                return integer;
            }
            double v = keepPrecision(Double.parseDouble(str), 0);
            integer = (int) v;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return integer;
    }

    /**
     * 除
     *
     * @param precision 小数位数
     * @param num1      String类型的数字对象
     * @return 默认四舍五入
     */
    public static String exceptDoubleNum(int precision, String num1, String num2) {
        return exceptDoubleNum(precision, num1, num2, true);
    }

    /**
     * 除
     *
     * @param precision 小数位数
     * @param num1      String类型的数字对象
     * @param isHalfUp  boolean ture 四舍五入 false 向下取整
     * @return 默认四舍五入
     */
    public static String exceptDoubleNum(int precision, String num1, String num2, boolean isHalfUp) {
        return exceptDoubleNum(precision, num1, num2, isHalfUp,true);
    }
    public static String exceptDoubleNum(int precision, String num1, String num2, boolean isHalfUp,boolean isNeedDealEndWithZero) {
        double doubleResult = 0;
        String result = "";
        try {
            if (!TextUtils.isEmpty(num1) && !TextUtils.isEmpty(num2)) {
                double parseDouble1 = Double.parseDouble(num1);
                double parseDouble2 = Double.parseDouble(num2);
                if (parseDouble2 != 0) {
                    doubleResult = parseDouble1 / parseDouble2;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return result;
        }
        double v = 0;
        if (isHalfUp) {
            v = keepPrecision(doubleResult, precision);
        } else {
            v = keepPrecisionDown(doubleResult, precision);
        }
        if (precision == 0) {
            result = ((int) v) + "";
        } else {
            result = v + "";
        }
        return keepPrecision(result,precision,isNeedDealEndWithZero);
    }

    /**
     * 不确定个数的数字相减
     *
     * @param precision 小数位数
     * isLessThanZero 是否小于0按0计算 默认按0
     * @param father    String类型的数字对象 减数
     * @param num       String类型的数字对象 被减数
     * @return
     */
    public static String reduceDoubleNum(int precision, String father, String... num) {
        return reduceDoubleNum(precision,true,father,num);
    }
    public static String reduceDoubleNum(int precision,boolean isLessThanZero, String father, String... num) {
        double doubleResult = 0;
        double fatherNum = 0;
        String result = "0";
        try {
            fatherNum = Double.parseDouble(father);
            for (String i : num) {

                if (!TextUtils.isEmpty(i)) {
                    double parseDouble = Double.parseDouble(i);
                    doubleResult += parseDouble;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return keepPrecision(result, precision);
        }
        double v = keepPrecision((fatherNum - doubleResult), precision);

        if (isLessThanZero &&v < 0) {
            v = 0;
        }
        if (precision == 0) {
            result = ((int) v) + "";
        } else {
            result = v + "";
        }

        return keepPrecision(result,precision);
    }

}
Android 精确计算工具类。 /** * @Title: Arith.java * @Package com.uxun.pay.util * @Description: TODO(用一句话描述该文件做什么) * @author daiw * @date 2016-1-5 上午9:05:34 * @version V1.0 */ package com.xwtec.commonutil; import java.math.BigDecimal; /** * Arith * (由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入) * @author chenke * @time 2017/12/5 16:22 * @mail ch_chenke@163.com */ public class Arith { //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; //这个类不能实例化 private Arith() { } /** * 提供精确的String转换成double * @param v * @return */ public static double strPreDou(String v) { BigDecimal b = new BigDecimal(v); return b.doubleValue(); } /** * 提供精确的加法运算。 * @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 BigDecimal("1"); return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值