2015-01-21 53 views
0

使用舍入時使用不同構造函數的bigdecimal有什麼區別?當運行下面的代碼:BigDecimal使用字符串和(int,long,double)構造函數進行舍入差異

public class RoundTest { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) {//2.425 
     BigDecimal intv = new BigDecimal(4.645); 
     BigDecimal doublev = new BigDecimal(4.645); 
     BigDecimal strV = new BigDecimal("4.645"); 
     BigDecimal longV = new BigDecimal(4.645); 

     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Int - "+intv.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Double -"+doublev.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("String - "+strV.setScale(2, RoundingMode.HALF_EVEN)); 

     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_UP)); 
     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_DOWN)); 
     System.out.println("Long - "+longV.setScale(2, RoundingMode.HALF_EVEN)); 
    } 
} 

輸出是:

Int - 4.64 
Int - 4.64 
Int - 4.64 
Double -4.64 
Double -4.64 
Double -4.64 
**String - 4.65** 
String - 4.64 
String - 4.64 
Long - 4.64 
Long - 4.64 
Long - 4.64 

爲什麼四捨五入使用字符串構造給出不同的結果比其他人呢?在使用BigDecimal四捨五入時是否還有其他差異?

+0

不清楚爲什麼你有'intv'和'longv' - 它們與'doublev'完全一樣,因爲你在所有情況下調用'BigDecimal(double)'構造函數。 – 2015-01-21 10:23:20

回答

3

爲什麼使用字符串構造函數進行舍入的結果與其他結果不同?

因爲它是你實際上傳遞恰好4.645一個價值的唯一時間。剩下的時間,你通過的double值接近於4.645,這不是實際上是 4.645 - 它是4.644999999999999573674358543939888477325439453125。

您可以使用BigDecimal.valueOf(double)創建BigDecimal值有效地解析double價值規範的字符串表示,而不是 - 然後你會得到相同的結果爲String