今私はこれを試しています:
int a = round(n);
n
はdouble
ですが、機能していません。何が間違っていますか?
スニペットのround()
メソッドの戻り値の型は何ですか?
これがMath.round()
メソッドの場合、入力パラメーターがDoubleのときにLongを返します。
したがって、戻り値をキャストする必要があります。
int a = (int) Math.round(doubleVar);
Math.round()が気に入らない場合は、この単純なアプローチも使用できます。
int a = (int) (doubleVar + 0.5);
丸め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).
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();
}
}
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ビットに型キャストできます。
Math.round
のドキュメントには次のように書かれています:
引数をintegerに丸めた結果を返します。結果は
(int) Math.floor(f+0.5)
と同等です。
int
にキャストする必要はありません。多分それは過去から変更されました。
public static int round(double d) {
if (d > 0) {
return (int) (d + 0.5);
} else {
return (int) (d - 0.5);
}
}