数据类型——BigDecimal

  1. 常用构造方法
BigDecimal(double val);

BigDecimal(int val);

BigDecimal(long val);

BigDecimal(String val);

注意事项:当构造方法的参数时是double类型时,会出现精度损失问题,如:

public class BigDecimalTest {
    public static void main(String[] args){
        double d = 301353.05;
        BigDecimal decimal = new BigDecimal(d);
        System.out.println(decimal);
        System.out.println(decimal.setScale(1, RoundingMode.HALF_UP));
    }
}

输出结果:

301353.0499999999883584678173065185546875
301353.0

解决方案之一:将对应的double类型数据转换成string类型,如:

public class BigDecimalTest {
    public static void main(String[] args){
        double d = 301353.05;
        System.out.println(new BigDecimal(new Double(d).toString()));
        System.out.println(new BigDecimal("301353.05"));
        System.out.println(new BigDecimal("301353.895898895455898954895989"));
    }
}

输出结果:

301353.05
301353.05
301353.895898895455898954895989

所以,如果需要保证精度,最好是不要使用BigDecimal的double参数的构造函数,因为存在损失double参数精度的可能,最好是使用BigDecimal的String参数的构造函数。

 

2.做加、减、乘、除操作

//加
BigDecimal add(BigDecimal augend);

//减
BigDecimal  subtract(BigDecimal subtrahend) 

//乘
BigDecimal  multiply(BigDecimal multiplicand)

//除
BigDecimal divide(BigDecimal divisor);

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode);用一个BigDecimal对象
除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么

3.设置精度问题

BigDecimal.setScale()方法用于格式化小数点

setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

scale(),返回当前BigDecimal的精度

 

转载于:https://my.oschina.net/u/3479706/blog/909962

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值