Thinking in java笔记(2)

Java提供了两个用于高精度计算的类:BigInteger和BigDecimal

BigInteger
BigInteger:支持任意精度的整数。
BigInteger(String val)
          将 BigInteger 的十进制字符串表示形式转换为 BigInteger。
BigInteger(String val, int radix)
          将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。

例如:
BigInteger bigInt = new BigInteger("11",2);
System.out.println("the big number is: " + bigInt);
结果显示:
the big number is: 3

BigDecimal
BigDecimal:支持任何精度的定点数。

网上摘录技巧集:
1、当你在数据库里插入一条数据是6.00时,在显示时却是6.000000000000000000000。
解决方法:使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为String( 如果利用double作为参数的构造函数,无法精确构造一个BigDecimal对象),然后构造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。
即:
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arith{ //默认除法运算精度
     private static final int DEF_DIV_SCALE = 10; //这个类不能实例化
     private Arith(){
    }
    /**
     * 提供精确的加法运算。
      * @param v1 被加数
      * @param v2 加数
      * @return 两个参数的和
      */
    public static double add(double v1,double v2){
        //将传入的double转换为String
        //如果利用double作为参数的构造函数,无法精确构造一个BigDecimal对象
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        //再将运算结果转换为double
        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();
    }
};
2、因此,使用这个类BigDecimal,需要注意 在构造方法中如果传入double,那么 不能保证他的精确程度
如:
           BigDecimal bigDec = new BigDecimal(6.217);
BigDecimal bigDecAdd = new BigDecimal(6.3229); BigDecimal bigDecResult = bigDec.add(bigDecAdd); System.out.println("the big decimal is: " + bigDecResult);
结果却是:
the big decimal is: 12.53989999999999938040673441719263792037963867187500
如果传入的是String类型,则:
the big decimal is: 12.5399

你可能感兴趣的:(java,UP)