BigDecimal用法详解

BigDecimal的构造方法

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

注意:

1
2
3
BigDecimal a =new BigDecimal(1.22);
System.out.println(a);
会输出:1.2199999999999999733546474089962430298328399658203125

通常建议优先使用String构造方法。

加减乘除

add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

保留小数

decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN)
第一位是保留多少位小数
第二位参数定义

ROUND_CEILING
Rounding mode to round towards positive infinity.
向正无穷方向舍入

ROUND_DOWN
Rounding mode to round towards zero.
向零方向舍入

ROUND_FLOOR
Rounding mode to round towards negative infinity.
向负无穷方向舍入

ROUND_HALF_DOWN
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round down.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

ROUND_HALF_EVEN
Rounding mode to round towards the “nearest neighbor” unless both neighbors are equidistant, in which case, round towards the even neighbor.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN

ROUND_HALF_UP
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round up.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_UNNECESSARY
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.
计算结果是精确的,不需要舍入模式

ROUND_UP
Rounding mode to round away from zero.
向远离0的方向舍入

BigDecimal进行比较大小

可以通过BigDecimal的compareTo方法来进行比较。 例如:new BigDecimal(“1”).compareTo(new BigDecimal(“2”));
返回的结果是int类型,-1表示小于,0是等于,1是大于。
即左边比右边数大,返回1,相等返回0,比右边小返回-1。注意 不可用equals进行相等的判断,equals 比较是两个BigDecimal对象的地址。

最大、最小值、绝对值、相反数

a.max (b) //比较取最大值
a.min(b) //比较取最小值
a.abs()//取最绝对值
a.negate()//取相反数

格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化引用
percent.setMaximumFractionDigits(3); //百分比小数点最多3位

BigDecimal loanAmount = new BigDecimal("15000.48"); //贷款金额
BigDecimal interestRate = new BigDecimal("0.008"); //利率
BigDecimal interest = loanAmount.multiply(interestRate); //相乘

System.out.println("贷款金额:\t" + currency.format(loanAmount));
System.out.println("利率:\t" + percent.format(interestRate));
System.out.println("利息:\t" + currency.format(interest));
}
输出:贷款金额: ¥15,000.48 利率: 0.8% 利息: ¥120.00

BigDecimal的3个toString方法

BigDecimal类有3个toString方法,分别是toEngineeringString、toPlainString和toString
toEngineeringString:有必要时使用工程计数法。工程记数法是一种工程计算中经常使用的记录数字的方法,与科学技术法类似,但要求10的幂必须是3的倍数
toPlainString:不使用任何指数
toString:有必要时使用科学计数法
spring mvc 接口返回json里面有BigDecimal对象的时候注意返回的是否是自己想要的。默认是使用toString进行json的转换。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.math.BigDecimal;

public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal bg = new BigDecimal("1E11");
System.out.println(bg.toEngineeringString());
System.out.println(bg.toPlainString());
System.out.println(bg.toString());
}
}

输出

100E+9
100000000000
1E+11

去掉多余的0(stripTrailingZeros)

BigDecimal原生提供了stripTrailingZeros方法可以实现去掉末尾的0,然后使用toPlainString可以输出数值,注意这里如果使用toString() 会变成科学计数法输出

其他常用方法

int scale()  //返回此 BigDecimal 的标度
int precision()  //返回此 BigDecimal 的精度
int signum()  //返回此 BigDecimal 的正负号函数
BigDecimal ulp()  //返回此 BigDecimal 的 ulp(最后一位的单位)的大小

开发者首页 wechat
欢迎您扫一扫上面的微信公众号