web-dev-qa-db-ja.com

doubleを丸めてintに変換する(Java)

今私はこれを試しています:

int a = round(n);

ndoubleですが、機能していません。何が間違っていますか?

104
David

スニペットのround()メソッドの戻り値の型は何ですか?

これがMath.round()メソッドの場合、入力パラメーターがDoubleのときにLongを返します。

したがって、戻り値をキャストする必要があります。

int a = (int) Math.round(doubleVar);
215
Mihir Mathuria

Math.round()が気に入らない場合は、この単純なアプローチも使用できます。

int a = (int) (doubleVar + 0.5);
25

丸めdouble「最近接」へintegerこのように:

1.4-> 1

1.6-> 2

-2.1-> -2

-1.-> -1

-1.5-> -2

private int round(double d){
    double dAbs = Math.abs(d);
    int i = (int) dAbs;
    double result = dAbs - (double) i;
    if(result<0.5){
        return d<0 ? -i : i;            
    }else{
        return d<0 ? -(i+1) : i+1;          
    }
}

条件は自由に変更できます(result <0.5).

11
anivaler
import Java.math.*;
public class TestRound11 {
  public static void main(String args[]){
    double d = 3.1537;
    BigDecimal bd = new BigDecimal(d);
    bd = bd.setScale(2,BigDecimal.ROUND_HALF_UP);
    // output is 3.15
    System.out.println(d + " : " + round(d, 2));
    // output is 3.154
    System.out.println(d + " : " + round(d, 3));
  }

  public static double round(double d, int decimalPlace){
    // see the Javadoc about why we use a String in the constructor
    // http://Java.Sun.com/j2se/1.5.0/docs/api/Java/math/BigDecimal.html#BigDecimal(double)
    BigDecimal bd = new BigDecimal(Double.toString(d));
    bd = bd.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
    return bd.doubleValue();
  }
}
3
Scott

Math.round関数はオーバーロードされますfloat値を受け取ると、intが返されます。たとえば、これは機能します。

int a=Math.round(1.7f);

Double値を受け取ると、長い値が返されるため、intに型キャストする必要があります。

int a=(int)Math.round(1.7);

これは、精度の損失を防ぐために行われます。 double値は64ビットですが、int変数は32ビットしか格納できないため、longに変換するだけです。これは64ビットですが、上記で説明したように32ビットに型キャストできます。

2
Divyansh Rai

Math.roundのドキュメントには次のように書かれています:

引数をintegerに丸めた結果を返します。結果は(int) Math.floor(f+0.5)と同等です。

intにキャストする必要はありません。多分それは過去から変更されました。

1
thug-gamer
public static int round(double d) {
    if (d > 0) {
        return (int) (d + 0.5);
    } else {
        return (int) (d - 0.5);
    }
}
0