2012-01-11 104 views
5

可能重複:
Round a double to 2 significant figures after decimal point捨去小數點

我試圖用小數度(23.1248)轉換成分鐘樣式度(23 7'29.3" )工作。 這是我到目前爲止有:

double a=23.1248; 
    int deg=(int)a;//gives me the degree 
    float b=(float) (a-deg); 
    int min=(int) (b*60);//gives me the minutes 
    double sec= (double) ((c*60)-min);//gives me my seconds 

一切工作正常,但我想將秒數舍入到最接近的十分數或者hndrenth。我看過十進制格式,但不希望將其轉換爲字符串。我也看過bigdecimal,但不認爲這會有所幫助,

+0

有一個在JS – 2012-01-11 19:12:56

+0

圓方法我還以爲小數點已經全面。減號,加號和除號都是平坦的:)爲了「四捨五入到100」,只需使用「Math.round()」:http://docs.oracle.com/javase/1.4.2/docs/api /java/lang/Math.html double x = round(y/100.0)* 100.0; – paulsm4 2012-01-11 19:14:46

+0

BigDecimal正常工作,您可以創建一個類似於此答案中的圓形(數字,小數)函數。試試吧,我不明白爲什麼它不起作用。 http://stackoverflow.com/a/8911683/744859 – 2012-01-18 15:46:42

回答

11

嘗試在放大數字後使用Math.round(double),然後縮小比例。

double x = 1.234; 
double y = Math.round(x * 100.0)/100.0; // => 1.23 

您也可以使用BigDecimal,如果你想獲得真正的重量級:

BigDecimal a = new BigDecimal("1.234"); 
BigDecimal b = a.setScale(2, RoundingMode.DOWN); // => BigDecimal("1.23") 
0

首先,有庫函數來做到這一點,那麼爲什麼不使用這些呢?參見Math.round()。沒有必要重新發明輪子。如果你想,但是,你可以嘗試下面的內容。爲了圓一個雙到百位:

x = 0.01 * floor(x * 100.0) 

爲了圓一個雙到第十位:

x = 0.1 * floor(x * 10.0) 

爲了圓一個雙到10-1K-地方:

x = 10^k * floor(x/10^k) 

任何語言的實現(包括Java)都應該是直截了當的。與此相關的一個問題是,它並不是真正的四捨五入,而是截斷了你的位置。爲了解決這個問題,你可以在舍入前簡單地將0.5 * 10^k加到你的號碼上。如果您只想整理,請使用上述版本,並在計算之前或之後添加10^k。

+0

難道你不想使用round()而不是floor()?如果是1dp,我預計0.193將被舍入到0.2。 – 2012-01-11 19:22:00

+0

@brainzzy我將討論如何使用base(10)數字的floor()原語實現與round()和ceiling()相同的操作。但是,基本上,是的,如果他想四捨五入到最近的(而不是總是上升或總是下降),round()應該起作用。 – Patrick87 2012-01-11 19:24:46