BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。因此,BigDecimal 表示的数值是 (unscaledValue × 10-scale)。

可以处理任意长度的浮点数运算。

BigDecimal add(BigDecimal val) //BigDecimal 加法

BigDecimal subtract (BigDecimal val) //BigDecimal 减法

BigDecimal multiply (BigDecimal val)  //BigDecimal 乘法

BigDecimal divide (BigDecimal val,RoundingMode mode)  除法

具体使用 计算:

   
  加:   a.add(b);

  减: a.subtract(b);

  乘:   a.multiply(b);

  除:   a.divide(b,2);//2为精度取值 
除法细解: 
  //注意以下相除会抛出异常,原因: 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常  
        //BigDecimal divideBg = a.divide(b);   
        //解决方法是:设置精确度;就是给divide设置精确的小数点 
divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)   
        //其中的第二个参数表示的是:保留小数点之后多少位

BigDecimal不整除抛出的异常,请设置精确度! 
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. 
at java.math.BigDecimal.divide(BigDecimal.java:1278) 
at main.Main.main(Main.java:41)

下面我们来看看除法的详细说明: 
   divide(BigDecimal divisor, int scale, introundingMode)

BigDecimal的setScale方法

BigDecimal.setScale()

方法用于格式化小数点

表示保留一位小数,默认用四舍五入方式

setScale(1)

直接删除多余的小数位,如2.35会变成2.3 setScale(1,BigDecimal.ROUND_DOWN)

进位处理,2.35变成2.4  setScale(1,BigDecimal.ROUND_UP)

四舍五入,2.35变成2.4  setScale(1,BigDecimal.ROUND_HALF_UP)

四舍五入,2.35变成2.3,如果是5则向下舍setScaler(1,BigDecimal.ROUND_HALF_DOWN)

注意点一

scale指的是你小数点后的位数。 
scale()就是BigDecimal类中的方法。如

BigDecimal b = new BigDecimal("123.456");

b.scale()返回的就是3 
注意点二roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,

有很多种,如 
BigDecimal.ROUND_HALF_UP表示的就是4舍5入

注意点三

divide(BigDecimal divisor, int scale, introundingMode)的意思是说: 
我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的

BigDecimal aa = new  BigDecimal(135.95 );

BigDecimal bb=new  BigDecimal("100" );

BigDecimal result=aa.multiply(bb);  //做加法

3.java中 BigDecimal类型的可以转换到double类型: 
  用 变量.doubleValue();函数  即可将 BigDecimal 类型数据 转化为 double类型! 
4.java BigDecimal比较大小

可以通过BigDecimal的compareTo方法来进行比较。 
返回的结果是int类型,-1表示小于,0是等于,1是大于。

看下面这个例子: 
BigDecimal a = new BigDecimal("1.00"); 
BigDecmial b = new BigDecimal(1);

想比较一下a和b的大小,一般都会用equals

System.out.println(a.equals(b)); 
但是输出结果是:false 
原因是:BigDecimal比较时,不仅比较值,而且还比较精度?

if(a.compareTo(b)==0) 结果是true

比较大小可以用 a.compareTo(b) 
返回值    -1 小于   0 等于    1 大于

5.BigDecimal取其中最大、最小值、绝对值、相反数:

  a.max (b) //比较取最大值

  a.min(b) //比较取最小值

  a.abs()//取最绝对值

  a.negate()//取相反数

6.下面是注意 :

BigDecimal枚举常量用法摘要  :

CEILING   
          向正无限大方向舍入的舍入模式。 
DOWN   
          向零方向舍入的舍入模式。 
FLOOR   
          向负无限大方向舍入的舍入模式。 
HALF_DOWN   
          向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。 
HALF_EVEN   
          向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 
HALF_UP   
          向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。 
UNNECESSARY   
          用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。 
UP   
          远离零方向舍入的舍入模式。

7.关于BigDecimal格式化

public String formatValue(Object value){ 
        String content = null; 
        if (value == null) { 
             content = ""; 
         } else { 
             if(value instanceof BigDecimal){ 
                 //conver to fortmat String 
                 NumberFormat nf = NumberFormat.getInstance(); 
                 nf.setMinimumFractionDigits(2); 
                 nf.setMaximumFractionDigits(2); 
                 content = nf.format(value);  
             }else{ 
                 content = String.valueOf(value); 
             } 
         } 
        return content; 
    }

使用这样一个方法可以达到格式化的效果,其中value instanceof BigDecimal,表示的是字符类型是BigDecimal类型的时候执行,这里的NumberFormat就表示字符类型,下面的两句代码就表示小数点后面的精确位数。

这里还要提到NumberFormat的其他两个类型:

getCurrencyInstance(): 返回当前默认 环境的货币格式

CurrencyInstance(): 返回指定语言 环境的数字格式,一般是百分比格式

8.在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。 
我们如果需要精确计算,非要用String来够造BigDecimal不可!

下面的这个工具类是是转载别人的,可以通过个工具类实现小数的精确计算。

1import java.math.BigDecimal;   
2/** *//**  
3* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精  
4* 确的浮点数运算,包括加减乘除和四舍五入。  
5*/  
6public class Arith{   
7    //默认除法运算精度   
8    private static final int DEF_DIV_SCALE = 10;   
9    //这个类不能实例化   
10    private Arith(){   
11    }   
12  
13    /** *//**  
14     * 提供精确的加法运算。  
15     * @param v1 被加数  
16     * @param v2 加数  
17     * @return 两个参数的和  
18     */  
19    public static double add(double v1,double v2){   
20        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
21        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
22        return b1.add(b2).doubleValue();   
23    }   
24    /** *//**  
25     * 提供精确的减法运算。  
26     * @param v1 被减数  
27     * @param v2 减数  
28     * @return 两个参数的差  
29     */  
30    public static double sub(double v1,double v2){   
31        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
32        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
33        return b1.subtract(b2).doubleValue();   
34    }    
35    /** *//**  
36     * 提供精确的乘法运算。  
37     * @param v1 被乘数  
38     * @param v2 乘数  
39     * @return 两个参数的积  
40     */  
41    public static double mul(double v1,double v2){   
42        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
43        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
44        return b1.multiply(b2).doubleValue();   
45    }   
46  
47    /** *//**  
48     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
49     * 小数点以后10位,以后的数字四舍五入。  
50     * @param v1 被除数  
51     * @param v2 除数  
52     * @return 两个参数的商  
53     */  
54    public static double div(double v1,double v2){   
55        return div(v1,v2,DEF_DIV_SCALE);   
56    }   
57  
58    /** *//**  
59     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
60     * 定精度,以后的数字四舍五入。  
61     * @param v1 被除数  
62     * @param v2 除数  
63     * @param scale 表示表示需要精确到小数点以后几位。  
64     * @return 两个参数的商  
65     */  
66    public static double div(double v1,double v2,int scale){   
67        if(scale<0){   
68            throw new IllegalArgumentException(   
69                "The scale must be a positive integer or zero");   
70        }   
71        BigDecimal b1 = new BigDecimal(Double.toString(v1));   
72        BigDecimal b2 = new BigDecimal(Double.toString(v2));   
73        return b1.divid(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
74    }   
75  
76    /** *//**  
77     * 提供精确的小数位四舍五入处理。  
78     * @param v 需要四舍五入的数字  
79     * @param scale 小数点后保留几位  
80     * @return 四舍五入后的结果  
81     */  
82    public static double round(double v,int scale){   
83        if(scale<0){   
84            throw new IllegalArgumentException(   
85                "The scale must be a positive integer or zero");   
86        }   
87        BigDecimal b = new BigDecimal(Double.toString(v));   
88        BigDecimal one = new BigDecimal("1");   
89        return b.divid(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
90     }   
91  }

bigdecimal的使用的更多相关文章

  1. BigDecimal 详细解析

    参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double, 而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal, 而在业务中常常有关B ...

  2. Java BigDecimal 转换,除法陷阱(转)

    源地址:   http://blog.csdn.net/niannian_315/article/details/24354251 今天在用BigDecimal“出现费解”现象,以前虽然知道要避免用, ...

  3. JAVA BigDecimal 小数点处理

    1,保留两位小数 方法一:{ double c=3.154215; java.text.DecimalFormat myformat=new java.text.DecimalFormat(" ...

  4. BigDecimal 处理集合

    1  创建一个BigDecimal 对象 BigDecimal Sum = new BigDecimal(0); 2  一个BigDecimal 对象,保留2位小数点 Sum.setScale(2,B ...

  5. BigDecimal用法详解

    一.简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...

  6. java 大数据处理类 BigDecimal 解析

    这两天,由于我的必修课概率论里经常要用到排列组合的计算,感觉很麻烦,加上现代智能手机的计算器是没有这方面功能的. 所以,就自己动手写了个安卓的 排列组合 计算器,用了一天,发现有很大的问题,阶乘达百亿 ...

  7. BigDecimal 加减乘除

    BigDecimal bignum1 = new BigDecimal("10"); BigDecimal bignum2 = new BigDecimal("5&quo ...

  8. 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法

    1. BigDecimal 类型数据 的创建,构造函数 有 public BigDecimal(BigInteger intVal, long val, int scale, int prec); p ...

  9. jdbctemplate中的批量更新使用,BigDecimal与造型的联系和区别

    //jdbctemplate批量新增的使用MENU_ID_LIST是前端页面传递到后端控制层,再由控制层传到实现层的List //JdbcTemplate是spring jdbctemplate通过注 ...

  10. 使用BigDecimal进行精确运算以及格式化输出数字

    一.引言    借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供 ...

随机推荐

  1. 01U盘PE系统制作方法

    1. 需要的工具和安装包:WinPE镜像文件 WinPE_x86.iso .已制作好的另一个启动盘(下文以映像总裁为例,当然也可以使用大白菜.U启动等) . 电脑.准备制作PE系统的空U盘 2. 还原 ...

  2. scrapy--cnblogs

    之前一直在学习关于滑块验证码的爬虫知识,最接近的当属于模拟人的行为进行鼠标移动,登录页面之后在获取了,由于一直找不到滑块验证码的原图,无法通过openCV获取当前滑块所需要移动的距离. 1.机智如我开 ...

  3. yii2 url 美化参数

    所谓的url参数美化就是将冗长的字符串 进行正则替换 yii2 框架的url参数美化完成需要完成两个阶段 第一个阶段分apache和nginx 两种的配置 apache :1.1 必须开启rewrit ...

  4. 为什么C++编译器不能支持对模板的分离式编译

    首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个 ...

  5. POJ 3662 (二分+SPFA

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8856   Accepted: 3211 D ...

  6. python使用网易邮箱发邮件

    # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText import email.mime.multip ...

  7. Enhacing the content with JavaScript

    What not to do :  In theory , you could use JavaScript to add important content to a web page. Howev ...

  8. js柱状图

    <!doctype html><html lang="en"><head><script type="text/javascri ...

  9. 十、mysql之索引原理与慢查询优化

    mysql之索引原理与慢查询优化 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还 ...

  10. 论如何入门地使用vscode

    微软大法好啊 这货更像是个gedit 以下内容只适合Oiers使用 本文档只适合新手引导的阶段使用 下载 这个是链接 可见这东西是和Emacs一样跨系统的 不知道为什么下载速度贼快 配置 还记得我们用 ...