java double 数进行计算但是结果不对怎么回事?

来源:百度知道 编辑:UC知道 时间:2024/05/25 13:47:05
程序如下

import java.util.*;
class TestCom{
public TestCom(){
}
public static void main(String[] arg){
TestCom tt = new TestCom();
tt.test();
}
public void test(){
double a1 = 4099.99;
double a2 = 969.01;
double a3 = 398.32;

System.out.print("com = ");
System.out.println(a1 - a2- a3);
}
}

结果是2732.6599999999994
怎么回事啊?谢谢
BigDecimal bd1 = new BigDecimal(a1);
BigDecimal bd2 = new BigDecimal(a2);
BigDecimal bd3 = new BigDecimal(a3);
BigDecimal zz = bd1.add(bd2.negate()).add(bd3.negate());

浮点数的直接加减法怎么会算得不对呢?非得用bigdecimal吗

在浮点数进行计算的时候,大多数存在丢失精度问题,正常的。
如果你觉得不好看,可以进行四舍五入,给你个代码:
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}

默认的类型输出是float