BigDecimal

来源:互联网 发布:cf36 1网络异常 编辑:程序博客网 时间:2024/06/03 13:07

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

我们先看一个简单的加减乘除:

package AOP;public class BeanTest {public static void main(String[] args) {System.out.println(0.64+1);System.out.println(1-0.42);System.out.println(4.02*10);System.out.println(4.02/10);}}
输出:

1.64000000000000010.580000000000000140.1999999999999960.40199999999999997
因为计算机是二进制表示的,无法精确表示浮点数!

然后就引入BigDecimal这个类,在使用它运算时分为三个步骤:

1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int等类型。

采用BigDecimal的构造方法或valueOf方法来转换BigDecimal对象

使用构造方法:

BigDecimal(int) 创建一个具有参数所指定整数值的对象。BigDecimal(double) 创建一个具有参数所指定双精度值的对象。BigDecimal(long) 创建一个具有参数所指定长整数值的对象。BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
使用valueOf()方法

//使用valueOf方法:BigDecimal b2 = BigDecimal.valueOf(0.48);
对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。
1 public BigDecimal add(BigDecimal value);                        //加法2 public BigDecimal subtract(BigDecimal value);                   //减法 3 public BigDecimal multiply(BigDecimal value);                   //乘法4 public BigDecimal divide(BigDecimal value);                     //除法
进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
我们也要注意一个setScale方法,BigDecimal有多种进位方式:①ROUND_UP                                       //远离0的舍入方式②ROUND_DOWN                                     //接近0的舍入方式③ROUND_CEILING                                  //接近正无穷大的舍入方式。④ROUND_FLOOR                                    //接近负无穷大的舍入方式⑤ROUND_HALF_UP                                 //四舍五入⑥ROUND_HALF_DOWN                               //五舍六入⑦ROUND_HALF_EVEN                              //银行家舍入法,如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。⑧ROUND_UNNECESSARY                            //该“伪舍入模式”实际是指明所要求的操作必须是精确的,否则抛出ArithmeticException
最后我们封装一个工具类:
package AOP;import java.math.BigDecimal;public class Arith {/**     * 提供精确加法计算的add方法     * @param value1 被加数     * @param value2 加数     * @return 两个参数的和     */    public static double add(double value1,double value2){        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));        return b1.add(b2).doubleValue();    }        /**     * 提供精确减法运算的sub方法     * @param value1 被减数     * @param value2 减数     * @return 两个参数的差     */    public static double sub(double value1,double value2){        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));        return b1.subtract(b2).doubleValue();    }        /**     * 提供精确乘法运算的mul方法     * @param value1 被乘数     * @param value2 乘数     * @return 两个参数的积     */    public static double mul(double value1,double value2){        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));        return b1.multiply(b2).doubleValue();    }        /**     * 提供精确的除法运算方法div     * @param value1 被除数     * @param value2 除数     * @param scale 精确范围     * @return 两个参数的商     * @throws IllegalAccessException     */    public static double div(double value1,double value2,int scale) throws IllegalAccessException{        //如果精确范围小于0,抛出异常信息        if(scale<0){                     throw new IllegalAccessException("精确度不能小于0");        }        BigDecimal b1 = new BigDecimal(Double.valueOf(value1));        BigDecimal b2 = new BigDecimal(Double.valueOf(value2));        return b1.divide(b2, scale,BigDecimal.ROUND_HALF_UP).doubleValue();        }}
package AOP;import java.math.BigDecimal;public class ArithTest {  public static void main(String[] args) throws IllegalAccessException {System.out.println(Arith.add(0.64, 1));System.out.println(Arith.sub(1,0.42));System.out.println(Arith.mul(4.23, 10));    System.out.println(Arith.div(4.12,10,2));    BigDecimal test=new BigDecimal(3.21);    System.out.println(test);    test=test.setScale(2,BigDecimal.ROUND_DOWN);    System.out.println(test);  }}
输出:1.64000000000000010.580000000000000142.3000000000000040.413.209999999999999964472863211994990706443786621093753.20





原创粉丝点击