public static void main(String[] args) {
float a = 16777216.0f;
System.out.println(a);
float b = 1.0f;
float c = a + b; // Noncompliant; yields 1.6777216E7 not 1.6777217E7
double d = a + b; // Noncompliant; addition is still between 2 floats
System.out.println("c:"+c + " d:" + d);
Float a0 = 16777216.0f;
System.out.println(a);
Float b0 = 1.0f;
Float c0 = a0 + b0; // Noncompliant; yields 1.6777216E7 not 1.6777217E7
double d0 = a0 + b0; // Noncompliant; addition is still between 2 floats
System.out.println("c0:"+c0 + " d0:" + d0);
double a1 = 16777219.0f;
double b1 = 1.0f;
double d1 = a1 + b1;
System.out.println("d1:" + d1);//noncompliant: yields 1.6777221E7 not 1.6777220E7
Double a10 = 16777219.0d;
Double b10 = 1.0d;
Double d10 = a10 + b10;
System.out.println("d10:" + d10);//正确
BigDecimal a2 = new BigDecimal(16777219.0);
BigDecimal b2 = new BigDecimal(2.0);
BigDecimal c2 = a2.add(b2) ;//正确
System.out.println("c2 = "+c2 );
}
从上面的测试看,float,Float, double 计算结果都出问题了。用Double和BigDecimal计算没有问题。
结论:小数的情况,如果值比较大,使用Double和BigDecimal定义,计算能保证正确。
Double dd1 = 10.0d; Double dd2 = 9.98d; System.out.println(dd1 - dd2); //0.019999999999999574
这样计算结果也有点问题啊。看来Double也不靠谱