BigDecimal大数值

一、前言
BIgDecimal大数值在精准计算方面很有用,因为Java中的float、double都是浮点数且表示范围有限,适用于科学技术和工程计数(也就说对精度要求不是很大的)计算机采用二进制存储,使用double等会损失精度,所以在银行或者保险行业中对数据的精度就需要解决上述问题,对数据得精度有很高的要求。(目前正在保险公司)因为系统中的关于某些数值都是原来都是使用double来表示,后来出了点系统问题,将相关属性改为使用BigDecimal,正好对其进行总结一下。
二、基本构造方法
1)public BigDecimal(char[] in)
2) public BigDecimal(String val)
3) public BigDecimal(double val) 这个需要注意
4) public BigDecimal(BigInteger val)
5)public BigDecimal(int val)
6) public BigDecimal(long val)
基本构造方法如上,也包括传入计算上下文数学规则,用于描述BIgDecimal的计算规则(保留小数位和舍入模式)等,如构造方法
public BigDecimal(String val, MathContext mc)等。
三、加减运算

        BigDecimal number1 = new BigDecimal("333");
        BigDecimal number2 = new BigDecimal("3");
        System.out.println("加法:"+number1.add(number2));
        System.out.println("减法:"+number1.subtract(number2));
        System.out.println("乘法:"+number1.multiply(number2));
        System.out.println("除法:"+number1.divide(number2));

无法对BigDecimal进行传统的"+、-、*、/"运算,只能通过调用方法的方式进行运算。同时除法还应该指定保留的小数位数。
三、特殊说明
关于BigDecimal的BigDecimal(double val) 构造方法,如果使用double类型的构造器,BigDecimal可能会得到一个不明确的数值。

 public static void main(String[] args) {
        BigDecimal number1 = new BigDecimal(3.33);
        BigDecimal number2 = new BigDecimal(2);
        BigDecimal number3 = new BigDecimal("3.33");
        System.out.println(number1.add(number2));
        System.out.println(number1);
        System.out.println(number2);
        System.out.println(number3);
        
    }

运行结果:
在这里插入图片描述
可以看到3.33后面的都是不可以预料的且对其进行运算的时候,结果也是不可预料的和预期的。
以下摘自百度百科的解释:
原因:JDK的描述:1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。2、另一方面,String 构造方法是完全可预知的:写入 newBigDecimal(“0.1”) 将创建一个 BigDecimal,它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法 [2] 。
当double必须用作BigDecimal的源时,请使用Double.toString(double)转成String,然后使用String构造方法,或使用BigDecimal的静态方法valueOf
四、两个对double精度设置的方法示例(四舍五入)

 public static String roundHalfUp(double value) {
        BigDecimal bigDecimal = new BigDecimal(String.valueOf(value)).setScale(2,BigDecimal.ROUND_HALF_UP);
        return String.valueOf(bigDecimal.doubleValue());
    }
    
   public static BigDecimal bigDecimalRoundHalfUp(double value){
        return new BigDecimal(String.valueOf(value)).setScale(2,BigDecimal.ROUND_HALF_UP);
    }

这两个方法同理,通过使用setScale方法保留两位小数,使用四舍五入规则。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵喵@香菜

感谢观众老爷送的一发火箭!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值