2012-02-09 93 views
0

增加雙重價值,我有以下代碼:錯誤而在Java

double d1=1000000000000000000.0; //which is equivalent to 1.0e^18 
double d2=3434.0; 
System.out.println(d1+d2); 

它打印的,而不是1000000000000003460什麼1000000000000003434.是什麼問題?

+5

double沒有您需要的精度級別。沒有足夠的有效數字。 – 2012-02-09 14:34:29

+0

@AnthonyPegram - 做出答案,而不是評論,因爲你是正確的。 – Paul 2012-02-09 14:36:18

+0

@AnthonyPegram - 也提供了一個替代方案。 – Mob 2012-02-09 14:41:07

回答

3

@Anthony Pegram是對的。如果你需要這樣的精度使用BigDecimal。

3

問題是雙類型本身,它不支持你想要的精度。你應該使用BigDecimal。

+1

只是好奇,但爲什麼他得到比預期的更大的結果?缺乏精確度會導致舍入錯誤? – MGZero 2012-02-09 15:09:11

+0

是的,缺乏精確的結果。 double類型可用於表示任何32位整數,但是當超出此範圍時,精度會降低,儘管您可以表示某些非常大的值。 – belgther 2012-02-09 15:40:15

0

需要的存儲數量超出預期。在這些情況下使用BIG十進制。

import java.math.BigDecimal;//remember to import this 
    public class UseBigDecimal{ 

    public static void main(String[]args){ 
    double d1=1000000000000000000.0; 
    double d2=3434.0; 

    BigDecimal bVal1 = new BigDecimal(d1); 
    BigDecimal bVal2 = new BigDecimal(d2); 

    BigDecimal sum = bVal1.add(bVal2);//you call the add() method not bVal1+bVal2 
    System.out.println ("Sum of BigDecimals " +sum.toString()); 
    //need to call toString() 
    } 

    }