float、Float、double都不靠譜

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章