2012-01-11 14 views
5

可能性の重複:
Round a double to 2 significant figures after decimal point丸め小数点

私は分スタイルの度(23 7'29.3" )に小数度(23.1248)を変換して動作するようにしようとしています。 これは私がこれまで持っているものです。

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 

すべてが正常に動作しますが、私は希望秒を最も近い10分の1秒またはhundrenthのいずれかに丸めます。私は小数点の書式を見てきましたが、文字列にキャストしたくないです。私もbigdecimalを見ましたが、それが役に立ちそうだとは思わないでください。

+0

私は小数点がすでにラウンドと思っていたのjs –

+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

+0

BigDecimalは問題なく動作しますが、この回答のように丸い(数値、小数点)関数を作成できます。試してみて、私はなぜそれがうまくいかないのか分かりません。 http://stackoverflow.com/a/8911683/744859 –

答えて

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^k個の場所にダブルを丸める:

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

任意の言語(Javaを含む)での実装は単純明快でなければなりません。この問題は、実際には丸められず、切り捨てられているということです。これを修正するには、丸めを行う前に0.5 * 10^kを番号に追加するだけです。丸めを行いたい場合は、上記のバージョンを使用し、計算の前後に10^kを追加します。

+0

floor()の代わりにround()を使用しませんか?私は0.193を0.2dに丸めて1dpにすると思います。 –

+0

@brainzzy私はfloor()プリミティブを基底10の数値に使って、round()とceiling()と同じことを達成する方法について議論します。しかし、本質的に、はい、もし彼が最も近いものに丸めたいのであれば、round()はうまくいくはずです。 – Patrick87

関連する問題