BigDecimal深入解析。

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

BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换。toString() 方法提供 BigDecimal 的规范表示形式。

BigDecimal 类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;否则,通过向该操作提供适当的 MathContext 对象,可以对已选择的精度和舍入模式执行计算。在任何情况下,可以为舍入控制提供八种舍入模式。使用此类(例如,ROUND_HALF_UP)中的整数字段来表示舍入模式已过时;应改为使用 RoundingMode enum(例如,RoundingMode.HALF_UP)的枚举值。

以上内容引用自BigDecimal API。简单来说BigDecimal主要用于精确计算(精度浮点数无法满足精确运算的需求),并且可以控制小数格式。

1.构造方法

构造方法为new BigDecimal(),其中输入参数可以为double,int,long,String,char[],BigInteger。其中String 和 char[]的构造方法类似。
char[] answer1 = {'1','2','3'};
String answer2 = "123";
BigDecimal a1,a2;
a1 = new BigDecimal(answer1);
a2 = new BigDecimal(answer2);
System.out.println("a1:"+a1.toString()+" a2:"+a2.toString());//两个值输出相同

2.BigDecimal的加减乘除

BigDecimal add(BigDecimal augend) 加法运算
BigDecimal subtract(BigDecimal subtrahend) 减法运算
BigDecimal multiply(BigDecimal multiplicand) 乘法运算
BigDecimal divide(BigDecimal divisor) 除法运算

BigDecimal a,b;//duble a,b;
a = new BigDecimal(1);//a = 1;
b = new BigDecimal(2);//b = 2;
a = a.add(b);// a = a + b;

其中 divide需要注意。
当遇到 Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide 错误

这是因为当被除数无法被除尽的时候,如1.0/3.0时会报错。
这时候可以使用这个方法
BigDecimal divide(BigDecimal divisor,int scale,MathContext mc);

divisor 为除数,scale为小数位数,MathContext为舍入模式。

3.MathContext

3.1 UP

public static final RoundingMode UP
远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值。

3.2 DOWN

public static final RoundingMode DOWN
向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值。

3.3 CEILING

public static final RoundingMode CEILING
向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.UP;如果结果为负,则舍入行为类似于 RoundingMode.DOWN。注意,此舍入模式始终不会减少计算值。

3.4 FLOOR

public static final RoundingMode FLOOR
向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于 RoundingMode.UP。注意,此舍入模式始终不会增加计算值。

3.5 HALF_UP

public static final RoundingMode HALF_UP
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN。注意,此舍入模式就是通常学校里讲的四舍五入。

3.6 HALF_DOWN

public static final RoundingMode HALF_DOWN
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN。

3.7 HALF_EVEN

public static final RoundingMode HALF_EVEN
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略。

3.8 UNNECESSARY

public static final RoundingMode UNNECESSARY
用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。如果对生成精确结果的操作指定此舍入模式,则抛出 ArithmeticException。

4.常用数学方法

abs()
返回 BigDecimal,其值为此 BigDecimal 的绝对值,其标度为 this.scale()。

equals(Object x)
比较此 BigDecimal 与指定的 Object 的相等性。

max(BigDecimal val)
返回此 BigDecimal 和 val 的最大值。

min(BigDecimal val)
返回此 BigDecimal 和 val 的最小值。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值