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


119

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

int a = round(n);

どこnされるdoubleが、それに動作していないです。何が悪いのですか?



6
「機能していない」ことをもっと詳しく説明する必要があります。何が起こるのですか?何が起こらないのですか?何を期待しましたか?どのようなエラーが発生しましたか?あなたは持っていますround()同じクラスのメソッドを?しましたかimport static java.lang.Math.*?等。数値を丸める方法はたくさんあります。そのため、考えられる答えもたくさんあります。言い換えれば、あなたの質問は曖昧で曖昧であり、現在の形では合理的に答えることができません。暗闇の中で撮影しています。
BalusC 2010

1
「機能しない」とは、最も近いintに丸めない、または例外をスローしない、または切り上げ/切り捨てしないことを意味しますか?この質問は、コンテキストと回答を相互参照する必要がないため、役に立ちません。
modulitos 2014

回答:


239

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

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

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

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

1
intにキャストするだけでなく、Math.toIntExact(long)の使用を検討してください。doubleはかなりの範囲の値を保持できるため、doubleが予想よりも大きい場合、おそらく最上位ビットを黙って破棄したくないでしょう。
その他の

キャストは必要ないと思います。過去だったかどうかはわかりませんが、roundはintを返します。
ドロップアウト

@Dropout Math.roundは、floatを指定するとintを返し、doubleを指定するとlongを返します。
Tur1ng 2018

27

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

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

4
好きではないのための貴重な理由は明らかにありませんMath.round()stackoverflow.com/a/6468757/1715716
ゴーティエBoaglio

3
このソリューションはより短く、インポートを必要とせず、最小限の変更で他の多くのプログラミング言語に移植できます。:そして、それもあなたのプラットフォームに応じて、より高速であるかもしれないstackoverflow.com/questions/12091014/...
博士ダニエルThommesの

1
私はあなたの答えを批判しているわけではありません。あなたが言及した理由から私はそれが非常に役立つと思います。私は、このコメントによってMath.round()、あなたが提供するソリューションと「文字通り」同じように使用することを恐れる人々に対処していました、それがすべてです。乾杯。
Gauthier Boaglio 2016

2
うん、nehzが言ったように、これは例えば-2.1から-1に丸めると思います。
ベンアーロンソン2016

5
@AlbertoHormazabal、彼が追加したことに気づきませんでした0.5か?
Sasha

11

「最も近い」への2倍の丸めこのような整数にます。

1.4 > 1

1.6 > 2

-2.1 > -2

-1.3 > -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;          
    }
}

必要に応じて条件(結果<0.5)を変更できます。


私は反対者の答えに同意します。しかし、最大の整数に四捨五入する必要がある場合は、以下のようにすることができます。double decimalNumber = 4.56777; System.out.println(new Float(Math.round(decimalNumber))); 出力:5
Smeet 2015年

3
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

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

int a=Math.round(1.7f);

double値を受け取るとlongになるので、intに型キャストする必要があります。

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

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


1

Math.round言うのドキュメント:

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

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


4
2つのMath.roundメソッドがあります。floatを取るものは整数を返します、それは正しいです。しかし、doubleをとる方はlongを返します。
ドミニクエーレンバーグ


-1

あなたは本当により完全な例を投稿する必要があるので、私たちはあなたが何をしようとしているのかを見ることができます。あなたが投稿したものから、ここに私が見ることができるものがあります。まず、組み込みのround()メソッドはありません。を呼び出すかMath.round(n)、静的にインポートしてMath.roundから、必要に応じて呼び出す必要があります。


まず、Javaにはグローバル関数はありません。
Danon 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.