天天看点

BigDecimal加减乘除使用

分享知识 传递快乐

简介

Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高精度计算。Float和Double只能用来做科学计算或者是工程计算;在金融计算中,对数字精度要求较高,必须使用 BigInteger 类和 BigDecimal 类,它支持任何精度的定点数,可以用它来精确计算货币值。使用此类可以完成大的小数操作,而且也可以使用此类进行精确的四舍五入,这一点在开发中经常使用。对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。

BigDecimal类常用方法

BigDecimal(String val):将String类型转换成BigDecimal类型数据(推荐使用)

BigDecimal(double val):将double类型转换成BigDecimal类型数据(不推荐使用)

BigDecimal valueOf(<T> t):将<T>类型转换成BigDecimal类型数据(推荐使用)

BigDecimal(int val):将int类型转换成BigDecimal类型数据

BigDecimal add(BigDecimal value):加法,求两个BigDecimal类型数据的和

BigDecimal subtract(BigDecimal value):减法,求两个BigDecimal类型数据的差

BigDecimal multiply(BigDecimal  value):乘法,求两个BigDecimal类型数据的积

BigDecimal divide(BigDecimal divisor):除法,求两个BigDecimal类型数据的商

BigDecimal remainder(BigDecimal divisor):求余数,求BigDecimal类型数据除以divisor的余数

BigDecimal max(BigDecimal value):最大数,求两个BigDecimal类型数据的最大值

BigDecimal min(BigDecimal value):最小数,求两个BigDecimal类型数据的最小值

BigDecimal abs():绝对值,求BigDecimal类型数据的绝对值

BigDecimal negate():相反数,求BigDecimal类型数据的相反数

这里要注意除法 divide 运算,BigDecimal除法可能出现不能整除的情况,比如 10.4/3.3,这时会报错:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1693)      

divide 运算方法:

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

第一参数表示除数。

第二个参数表示小数点后保留位数。

第三个参数表示舍入模式。只有在作除法运算或四舍五入时才用到舍入模式。

舍入模式有以下几种:

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的方向舍入

注意

1. double参数的构造方法,不允许使用!因为它不能精确的得到相应的值,值会变大;

2. String构造方法是完全可预知的:写入newBigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1;因此,通常建议优先使用String构造方法;

3. 静态方法valueOf(doubleval)内部实现,仍是将double类型转为String类型;

4. BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象,所以在做加减乘除运算时千万要保存操作后的值。

​​阅读代码​​