博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中BigDecimal类详解
阅读量:4149 次
发布时间:2019-05-25

本文共 3493 字,大约阅读时间需要 11 分钟。

前言:float和double只能用来做科学计算或者是工程计算。在商业计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值。

 BigDecimal本身支持基础的数学计算,可以使用BigDecimal还有一个非常重要的目的,可以利用它来实现准确的四舍五入操作。

1.BigDecimal构造器

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

以上都是比较常用的构造器,他们返回的对象都是BigDecimal对象。换而言之,将各个类型的值转换为BigDecimal对象,就是通过构造器。如果想将BigDecimal对象转换为其他类型的对象,我们通过以下几种:

toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。

2.BigDecimal常用方法

注意,由于一般数值类型,例如double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用 BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算 符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。 

2.1 加减乘除

  1. 加法:add

  2. 减法:subtract

  3. 乘法:multiply
  4. 除法:divide

代码示例如下:

package com.example.pdf.test;import java.math.BigDecimal;public class Demo3 {    public static void main(String[] args) {        BigDecimal b1 = new BigDecimal("10");        BigDecimal b2 = new BigDecimal("50");                System.out.println("加法,求两个BigDecimal类型数据的和:"+b1.add(b2));        System.out.println("减法,求两个BigDecimal类型数据的差:"+b1.subtract(b2));        System.out.println("乘法,求两个BigDecimal类型数据的积:"+b1.multiply(b2));        System.out.println("求余数,求b1除以b2的余数:"+b1.remainder(b2));        System.out.println("最大数,求两个BigDecimal类型数据的最大值:"+b1.max(b2));        System.out.println("最小数,求两个BigDecimal类型数据的最小值:"+b1.min(b2));        System.out.println("绝对值,求BigDecimal类型数据的绝对值:"+b1.abs());;        System.out.println("相反数,求BigDecimal类型数据的相反数:"+b1.negate());;    }}

结果如下所示:

除法 divide有三个参数的方法,第一参数表示除数,第二个参数表示小数点后保留位数,第三个参数表示取舍规则。

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

只有在作除法运算或四舍五入时才用到取舍规则, 因为BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result。所以当我们用三参数的除法方法时,规定了保留几位小数以及你的保留方式,就可以避免异常。

我们最常用的四舍五入就是是 ROUND_HALF_UP,下面列几个比较常见的取舍规则:

ROUND_CEILING 向正无穷方向舍入。
ROUND_DOWN 向零方向舍入
ROUND_FLOOR 向负无穷方向舍入
ROUND_HALF_DOWN 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY 计算结果是精确的,不需要舍入模式
ROUND_UP 向远离0的方向舍入

例如,RoundingMode其实是个枚举类,点进去源码可以看到其实他就是匹配到几种取舍规则

a.divide(b,2,RoundingMode.HALF_UP)

2.2 大小比较

package com.example.pdf.test;import java.math.BigDecimal;public class Demo3 {    public static void main(String[] args) {        BigDecimal a = new BigDecimal(20);        BigDecimal b  = new BigDecimal(40);        //前提为a、b均不能为null        if(a.compareTo(b) == -1){            System.out.println("a小于b");        }        if(a.compareTo(b) == 0){            System.out.println("a等于b");        }        if(a.compareTo(b) == 1){            System.out.println("a大于b");        }        if(a.compareTo(b) > -1){            System.out.println("a大于等于b");        }        if(a.compareTo(b) < 1){            System.out.println("a小于等于b");        }    }}

2.3 四舍五入

setScale()有3个方法,第一个参数就是你要保留几位,第二个可填的参数就是取舍规则。如果你第二个参数不加,仅仅想保留几位,会自动帮你选择默认的规则。

ROUND_UNNECESSARY:计算结果是精确的,不需要舍入模式。

3.数据库设计

BigDecimal在进行入库时, 数据库选择decimal类型, 长度可以自定义,如10; 小数点我们项目中用的是4, 保留4位小数. 此外还要注意的就是默认值, 一定写成0.0000, 不要用默认的NULL, 否则在进行加减排序等操作时, 会带来转换的麻烦。

numericalValue decimal(10,2) DEFAULT '0.0000' COMMENT '数值',

 

--------------如果大家喜欢我的博客,可以点击左上角的关注哦。

转载地址:http://bupti.baihongyu.com/

你可能感兴趣的文章
【JavaScript 教程】标准库—Date 对象
查看>>
前阿里手淘前端负责人@winter:前端人如何保持竞争力?
查看>>
【JavaScript 教程】面向对象编程——实例对象与 new 命令
查看>>
我在网易做了6年前端,想给求职者4条建议
查看>>
SQL1015N The database is in an inconsistent state. SQLSTATE=55025
查看>>
RQP-DEF-0177
查看>>
MySQL字段类型的选择与MySQL的查询效率
查看>>
Java的Properties配置文件用法【续】
查看>>
JAVA操作properties文件的代码实例
查看>>
IPS开发手记【一】
查看>>
Java通用字符处理类
查看>>
文件上传时生成“日期+随机数”式文件名前缀的Java代码
查看>>
Java代码检查工具Checkstyle常见输出结果
查看>>
北京十大情人分手圣地
查看>>
Android自动关机代码
查看>>
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>