BigDecimal类和以BigDecimal类为基础定义类Arith工具类

一、认识

float和double两种数据类型容易引起精度的丢失,所以java提供BigDecimal类提高精度。该类提供了大量的构造器用于 创建BigDecimal 对象,把所有的基本数值类型变量转换成一个BigDecimal对象。

二、常用的两个构造器:

1、BigDecimal(double value):不推荐使用该构造器,因为当使用new BigDecimal(0.1)来创建一个对象时,它的值不是0.1,而实际上是一个近似0.1的值,表面看着是个0.1。

2、BidDiecimal(String value):推荐使用这个构造器,newBigDecimal("0.1")来创建一个对象时,得到的和预期的一样是个0.1的值。

注意如果非要接收一个double的值得话,可以通过BigDecimal.valueOf(double value)静态方法来创建对象。例如:

BigDecimal f2 = BigDecimal.valueOf(0.01);

三、基本操作

add(BigDecimal value):精确加法

subtract(BigDecimal value):精确减法

multiply(BigDecimal value):精确乘法

divide(BigDecimal value);精确除法

四、java实现

import java.math.BigDecimal;

public class BigDecimalTest {
    public static void main(String[] args){
        BigDecimal f1 = new BigDecimal("0.05");
        BigDecimal f2 = BigDecimal.valueOf(0.01);
        BigDecimal f3 = new BigDecimal(0.05);
        System.out.println(f1);
        System.out.println("使用String作为BigDecimal构造器参数");
        System.out.println(f2);
        System.out.println("0.05 + 0.01 = " + f1.add(f2));
        System.out.println("0.05 - 0.01=" + f1.subtract(f2));
        System.out.println("0.05 * 0.01=" + f1.multiply(f2));
        System.out.println("0.05 / 0.01=" + f1.divide(f2));
        System.out.println("使用double作为BigDecimal构造器参数:");
        System.out.println("0.05 + 0.01 =" + f3.add(f2));
        System.out.println("0.05 - 0.01 =" + f3.subtract(f2));
        System.out.println("0.05 * 0.01 =" + f3.multiply(f2));
        System.out.println("0.05 / 0.01 =" + f3.divide(f2));
    }
}

结果:

五、Arith工具类

过程:先将double数值包装成BigDecimal类型,运算出结果后,再转成double类型。

java实现:

import java.math.BigDecimal;

public class Arith {
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    //构造器私有,让这个类不能实例化
    private Arith(){}
    //提供精确的加法运算
    public static double add(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }
    //提供精确的减法运算
    public static double sub(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }
    //提供精确的乘法运算
    public static double mul(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }
    //提供精确的除法运算
    public static double div(double v1,double v2){
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2).doubleValue();
    }
}

//ArithMain类

public class ArithMain {
    public static void main(String[] args){
        System.out.println("0.06 + 0.02 = " + Arith.add(0.06,0.02));
        System.out.println("0.06 - 0.02 = " + Arith.sub(0.06,0.02));
        System.out.println("0.06 * 0.02 = " + Arith.mul(0.06,0.02));
        System.out.println("-123.3 / 100 = " + Arith.div(-123.3,100));

    }
}

结果:

 

 

 

 

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、付费专栏及课程。

余额充值