BigDecimal和DecimalFormat

package app.com.mybigdecimal;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;

/**
 * Created by Administrator on 2017/9/8.
 *
 * 不能用float,会丢失精度,最好是传入String类型
 *
 *  double可以16位数不会丢失精度,多了就失精度
 * float可以8位数不会丢失精度,多了就失精度
 *
 * 2.当浮点型数位太大时,直接加双引号或toString 会变成科学计数法
 * Log.d("=====math",Double.toString(100000000.61d));   //1.0000000061E8
 *
 *
 *
 *
 */

public class MyMath {

    public static double add(String d1, String d2)
    {        // 进行加法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.add(b2).doubleValue();
    }
    public static double sub(String d1, String d2)
    {        // 进行减法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
    }

    public static double sub(double d1, double d2)
    {        // 进行减法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.subtract(b2).doubleValue();
    }


    public static double mul(String d1, String d2)
    {        // 进行乘法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.multiply(b2).doubleValue();
    }
    public static double div(String d1,
                             String d2,int len) {// 进行除法运算
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        return b1.divide(b2,len,BigDecimal.
                ROUND_HALF_UP).doubleValue();
    }



    /*==================================================================================*/
    /*
    * 将字符串数字或者浮点类型进行四舍五入保留num位小数点
    *
    * roundString("450359962737049688.136",2)
    * 输出:
    *  450359962737049688.14
    *
    *  roundString(450359962737049688d.136,2)
    *  输出:
    *  450359962737049664.00  //因为double 位数16才能不丢失精度
    *
    * */
    public static String roundString(String d, int len) {     // 进行四舍五入
        BigDecimal b1 = new BigDecimal(d);
        BigDecimal b2 = new BigDecimal(1);
        // 任何一个数字除以1都是原数字
        // ROUND_HALF_UP是BigDecimal的一个常量,
        return b1.divide(b2, len,BigDecimal.
                ROUND_HALF_UP).toString();
    }

    public static String roundString(double d, int len) {     // 进行四舍五入
        BigDecimal b1 = new BigDecimal(d);
        BigDecimal b2 = new BigDecimal(1);
        // 任何一个数字除以1都是原数字
        // ROUND_HALF_UP是BigDecimal的一个常量,
        return b1.divide(b2, len,BigDecimal.
                ROUND_HALF_UP).toString();
    }
    /*
    * 转为double如果数字太长会显示5.996273714E7,所以看情况要不要在进行字符串数字的转换
    *
    * */
    public static double roundDouble(String d, int len) {     // 进行四舍五入
        BigDecimal b1 = new BigDecimal(d);
        BigDecimal b2 = new BigDecimal(1);
        // 任何一个数字除以1都是原数字
        // ROUND_HALF_UP是BigDecimal的一个常量,
        return b1.divide(b2, len,BigDecimal.
                ROUND_HALF_UP).doubleValue();
    }

    public static double roundDouble(double d, int len) {     // 进行四舍五入
        BigDecimal b1 = new BigDecimal(d);
        BigDecimal b2 = new BigDecimal(1);
        // 任何一个数字除以1都是原数字
        // ROUND_HALF_UP是BigDecimal的一个常量,
        return b1.divide(b2, len,BigDecimal.
                ROUND_HALF_UP).doubleValue();
    }

/*==================================================================================*/
    /**
     * 将小数四舍五入保留num位小数点,不能传入String
     *
     * double可以16位数不会丢失精度,多了就失精度
     * float可以8位数不会丢失精度,多了就失精度
     *
     */
    public static String formatDoubleData( double f) {
        DecimalFormat decimalFormat = new DecimalFormat("0.000");//构造方法的字符格式这里如果小数不足2位,会以0补足.
        String p = decimalFormat.format(f);
        return p;
    }
    public static String formatDoubleData( float f) {
        DecimalFormat decimalFormat = new DecimalFormat("0.000");//构造方法的字符格式这里如果小数不足2位,会以0补足.
        String p = decimalFormat.format(f);
        return p;
    }



/*==================================================================================*/

    /*
    * 把浮点型转成了String类型
    * formatDoubleData2(0.00112d)
    * 输出
    * 0.0011199999999999999018840401987517907400615513324737548828125
    *
    * */

    public static String formatDoubleData2( double  f) {

        BigDecimal decimalFormat = new BigDecimal(f);
        return decimalFormat.toString();
    }

    /*================================*/


    /**
     * 保留double类型小数后两位,不四舍五入,直接取小数后两位 比如:10.1269 返回:10.12
     *
     * 先把数值转化成有四个小数点的数值,然后判断小数点的位置,然后截取到小数点后两位
     */
    public static String formatDouble(double doubleValue) {
        // 保留4位小数
        DecimalFormat df = new DecimalFormat("#.0000");
        String result = df.format(doubleValue);
        // 截取第一位
        String index = result.substring(0, 1);
        if (".".equals(index)) {
            result = "0" + result;
        }
        // 获取小数 . 号第一次出现的位置
//        int inde = firstIndexOf(result, ".");
        int inde = result.indexOf(".");

        // 字符串截断,截取到只剩下两位数
        return result.substring(0, inde + 3);
    }
    /**
     * 查找字符串pattern在str中第一次出现的位置
     */
    public static int firstIndexOf(String str, String pattern) {
        for (int i = 0; i < (str.length() - pattern.length()); i++) {
            int j = 0;
            while (j < pattern.length()) {
                if (str.charAt(i + j) != pattern.charAt(j))
                    break;
                j++;
            }
            if (j == pattern.length())
                return i;
        }
        return -1;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值