2016-11-14 43 views
0

我使用Java 7的,我只是想將值四捨五入至小數點後2位,樣本代碼也從各種計算器環節給出:四捨五入值至2位小數在java中

Double d1= 4.37 ,  d2=0.694444444; //expected result after multiplication of numbers d1 and d2 is 3.04 
DecimalFormat df = new DecimalFormat("#.#####"); 
     String str = df.format(d1*d2); 
     d=(Double)df.parse(str); 
     System.out.println(d);//Prints 3.03472 
     df = new DecimalFormat("#.####"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d);//Prints 3.0347 
     df = new DecimalFormat("#.###"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d);//Prints 3.035 
     df = new DecimalFormat("#.##"); 
     str = df.format(d); 
     d= (Double)df.parse(str); 
     System.out.println(d); //Prints my desired result 3.04 

這難道不是可能的話可以在2或3條語句中做到這一點。

問候

克里斯

+0

哈哈,它是java。大多數事情至少需要10行代碼 –

+1

爲什麼不保留小數分辨率,而當我們要輸出時,請保留我們的'System.out.println(String.format(「%。2f」,d))'。 –

+0

@HaleemurAli:我想將最終結果3.04分配給一個雙變量,最後將其存儲在數據庫中。問候,克里斯 – chiku

回答

1

的問題是,預期的結果3.04是沒有意義的,如果四捨五入到最接近的值應該是3.03。 4.37 * 0.694444444結果是3.03472222028,這是接近3.03再到3.04:

abs 3.03472222028 - 3.03 = 0.00472222028 
abs 3.03472222028 - 3.04 = 0.00527777972 

所以實際上你需要的是

new DecimalFormat("#.##"); 

但作爲Klitos說,你可能會想保留真正的價值儘可能長,只有當你不得不堅持到數據庫纔會發生。在那裏你可以使用

String.format("%.2f", value) 

更新17/11

隨着比如你提供:

DecimalFormat df = new DecimalFormat("#.##"); 
    String result = df.format(10.85*1/1.44); 

結果是7.53(正確的)。 但是,用你的代碼,結果是7.54,這是錯誤的。

這是因爲您按順序舍入每個數字並且累積錯誤,導致舍入錯誤,如您在提供的示例中可以看到的那樣。

所以你真的不需要編寫自己的舍入算法。你可以使用默認的new DecimalFormat("#.##")

+0

我正在寫一個小的java程序來提取excel舍入值並將其轉儲到db中,示例數據如下所示: 收入,Fx比率(1/1.44),Actual,Calc,Diff,(Revenue * Fx Rate ) 10.85,0.6694444444,7.53,7.54,-0.009999999999999787,7.5347222174 //錯誤 10.98,0.6694444444,7.63,7.63,0.0,7.62499999512 //精確度 關於kris – chiku