BigDecimal 、BigInteger

package com.BigDecimal;

public class BigDecimalDemo {
    /*
     * 下面的运算的结果出乎我们的意料,有些准确,有些不准确
     * 这是为什么呢?
     * 我们知道,数据进行运算时先将它转换成为补码进行运算,所以就设计到一个二进制转换的问题
     *    浮点数的小数点后面的数是乘以2得1 0计算二进制的对吧,因为有些小数无论如何就是不能得到0,
     *    也就是一个无限的小数类,这样的数据永远无法得到完整的10表示,所以float和double操作时候
     *    出现一个叫做有效数字的说法。当然后面一个是可以的,那是因为两个浮点数刚好可以转换好0101
     *          这是因为浮点数的存储和整形的存储不同导致的。它们大部分的时候,都是带有有效数字位
     * 引出BigDecimal
     *      由于在运算的时候,float类型和double很容易丢失精度。所以,为了能精确的表示、计算浮点数,java提供了BigDecimal
     * BigDecimal类概述
     *     不可变的,任意精度的有符号十进制数。可以解决精度丢失问题
     */
    public static void main(String[] args) {
        System.out.println(0.09+0.01);//0.09999999999999999
        System.out.println(1.0-0.32);//0.6799999999999999
        System.out.println(1.015*100);//101.49999999999999
        System.out.println(1.301/100);//0.013009999999999999
        
        System.out.println(1.0-0.12);//0.88
    }

}

package com.BigDecimal;

import java.math.BigDecimal;

/*
 * 构造方法
 *     public BigDecimal(String val)
 * 
 *     public BigDecimal add(BigDecimal augend) :加
 *     public BigDecimal subtract(BigDecimal subtrahend) 减
 *     public BigDecimal multiply(BigDecimal multiplicand) 乘
 *     public BigDecimal divide(BigDecimal divisor) 除
 *     public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode) 商 几位小数 如何舍取
 * 
 * 
 */
public class BigDecimalDemo02 {
    public static void main(String[] args) {
//        System.out.println(0.09+0.01);//0.09999999999999999
//        System.out.println(1.0-0.32);//0.6799999999999999
//        System.out.println(1.015*100);//101.49999999999999
//        System.out.println(1.301/100);//
        BigDecimal bd1=new BigDecimal("0.09");
        BigDecimal bd2=new BigDecimal("0.01");
        System.out.println("add:"+bd1.add(bd2));
        System.out.println("--------------------------");
        
        BigDecimal bd3=new BigDecimal("1.0");
        BigDecimal bd4=new BigDecimal("0.32");
        System.out.println("subtract:"+bd3.subtract(bd4));
        System.out.println("--------------------------");
        
        BigDecimal bd5=new BigDecimal("1.015");
        BigDecimal bd6=new BigDecimal("100");
        System.out.println("multiply:"+bd5.multiply(bd6));
        System.out.println("--------------------------");
        
        BigDecimal bd7=new BigDecimal("1.301");
        BigDecimal bd8=new BigDecimal("100");
        System.out.println("divide:"+bd7.divide(bd8));
        System.out.println("--------------------------");
        System.out.println("divide:"
                +bd7.divide(bd8,3,BigDecimal.ROUND_HALF_UP));//ROUND_HALF_UP四舍五入,其他方式舍取看API
        System.out.println("divide:"
                +bd7.divide(bd8,8,BigDecimal.ROUND_HALF_UP));
    }
}
View Code
package com.BigInteger;

import java.math.BigInteger;

public class BigIntegerDemo {
    /*
     * 引入BigInteger
     *     Integer的范围是太小了,无法进行大的整数运算
     * java.math
     * 不可变的任意精度的整数。所有操作都以二进制补码进行,说明运算效率高
     *  讲一个构造:
     *      BigInteger(String val)
     *  3个常量:
     *  static BigInteger ONE :常量1
     *  static BigInteger TEN :常量10
     *  static BigInteger ZERO :常量0
     *  一个方法:
     *      static valueOf(long val) 返回其值等于指定long值得BigInteger
     */
    public static void main(String[] args) {
        //这几个测试是为了检测超过int范围内,Integer不能在表示,更谈不上计算
        /*Integer i=new Integer(100);
        System.out.println(i);
        System.out.println(Integer.MAX_VALUE);
        Integer ii=new Integer("2147483647"); 
        System.out.println(ii);
        Integer iii=new Integer("2147483648");*/
        
        BigInteger bi=new BigInteger("2147483648");
        System.out.println(bi);//看出重写了toString()
    }

}

package com.BigInteger;

import java.math.BigInteger;

/*
 * 介绍几个常用方法,其他查看API
 * public BigInteger add(BigInteger val):加
 * public BigInteger subtract(BigInteger val):减
 * public BigInteger multiply(BigInteger val):乘
 * public BigInteger divide(BigInteger val):除
 * public BigInteger[] divideAndRemainder(BigInteger val) 商和摩的数组 
 */
public class BigIntegerDemo2 {
    public static void main(String[] args) {
        BigInteger bi1=new BigInteger("100");
        BigInteger bi2=new BigInteger("50");
        System.out.println("add:"+bi1.add(bi2));
        System.out.println("subtract:"+bi1.subtract(bi2));
        System.out.println("multiply:"+bi1.multiply(bi2));
        System.out.println("divide:"+bi1.divide(bi2));
        System.out.println("divideAndRemaunder:"+bi1.divideAndRemainder(bi2)[0]+"\t"+bi1.divideAndRemainder(bi2)[1]);
        
    }

}
View Code

 

posted @ 2016-06-07 09:40  guodaxia  阅读(226)  评论(0编辑  收藏  举报