有这么两组数:
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
解决