关于java浮点数的一些问题,BigDecimal的累加

事情的起因

有这么两组数:
a :83.86 71.81 69.3 65.49 79.03 380.57
b:2.52 2.15 2.08 1.96 2.37 380.57
在计算数组a[i]+b[i]累加的过程中遇到这个问题

float[] money = {(float) 83.86, (float) 71.81, (float) 69.3, (float) 65.49, (float) 79.03};
        float[] tax = {(float) 2.52, (float) 2.15, (float) 2.08, (float) 1.96, (float) 2.37};
        float c = 0;
        for (int i = 0; i < money.length; i++) {
            c+=money[i]+tax[i];
        }
        System.out.println(c);

打印结果 380.56998,非常离谱,纯加操作怎么不可能把最多小数点后两位的数加成小数点后五位。一开始想的主要原因是因为第一组数里面夹杂这一个只有一位小数的。果不其然,每一次循环打印一次结果
86.38
160.34
231.72
299.16998
380.56998
第三次循环加出的问题,然后网上找了一大堆资料,最初的想得是强制保留两位于是👇

float[] money = {(float) 83.86, (float) 71.81, (float) 69.3, (float) 65.49, (float) 79.03};
        float[] tax = {(float) 2.52, (float) 2.15, (float) 2.08, (float) 1.96, (float) 2.37};
        float c = 0;
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        for (int i = 0; i < money.length; i++) {
            c+=Float.parseFloat(decimalFormat.format(money[i]))+Float.parseFloat(decimalFormat.format(tax[i]));
            System.out.println(c);
        }
        System.out.println(c);

使用Decimalformat把float类型转为String格式化,然后转回去,转化的很成功但是结果失败了。。。
于是又查,找到了BigDecimal,然后查了一下他的方法确实挺好用的,构造方法参数可以为double,String,int,bigdecimal.add()就可以实现加法,同样的减法substract()函数, 乘法multiply()函数,除法divide()函数,竟然还自带绝对值abs()函数。加法是很不错但是弄累加的时候就是不行。

float[] money = {(float) 83.86, (float) 71.81, (float) 69.3, (float) 65.49, (float) 79.03};
        float[] tax = {(float) 2.52, (float) 2.15, (float) 2.08, (float) 1.96, (float) 2.37};
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        BigDecimal c = new BigDecimal(0);
        for (int i = 0; i < money.length; i++) {
            System.out.print(tax[i]+"  ");
            BigDecimal money1 = new BigDecimal(String.valueOf(money[i]));
            BigDecimal tax1 = new BigDecimal(decimalFormat.format(tax[i]));
            c.add(tax1.add(money1));
        }
        System.out.println(c);

最后输出结果为0,中间尝试了很多办法,包括一系列的转化,使用FloatValue()方法转回浮点型,结果回到了起点。
最后最后最后,发现一个大问题,实际上BigDecimal的运算方法都是有返回值的,也就是说明我一直徘徊在一个很间的方法传参问题上,方法参数的指是无法被改变的,一定要接收这个返回值
于是👇

float[] money = {(float) 83.86, (float) 71.81, (float) 69.3, (float) 65.49, (float) 79.03};
        float[] tax = {(float) 2.52, (float) 2.15, (float) 2.08, (float) 1.96, (float) 2.37};
        DecimalFormat decimalFormat = new DecimalFormat("#.00");
        BigDecimal c = new BigDecimal(0);
        for (int i = 0; i < money.length; i++) {
            BigDecimal money1 = new BigDecimal(String.valueOf(money[i]));
            BigDecimal tax1 = new BigDecimal(decimalFormat.format(tax[i]));
            //关键点
            c=c.add(tax1.add(money1));
        }
        System.out.println(c);

输出 380.57
解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值