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定義,計算能保證正確。