Javaでfloatをintに変換する方法


342

次の行を使用してfloatをintに変換しましたが、希望するほど正確ではありません。

 float a=8.61f;
 int b;

 b=(int)a;

結果は次のとおりです。8(それがあるべき9

の場合a = -7.65f、結果は次のとおりです-7(それはである必要があります-8

それを行うための最良の方法は何ですか?


16
型キャストを行うだけで値が切り捨てられ、値の丸め/フローリング操作は実行されないことに注意してください。
ブライアングラハム

回答:


678

を使用Math.round()すると、floatが最も近い整数に丸められます。


1
Math.round()の後に型キャストが必要なのはなぜですか?
ネクロマンサー2012年

81
Math.round()int値を返すため、を使用した型キャスト(int)は冗長です。
ソルベック

5
どちらかまたは両方を使用するの(int)fooが簡単です。
yuttadhammo

31
ソルベクの答えは正しいですが、Math.round()は入力に基づいて2つの異なる出力タイプを持つことができることを指摘しておきます。Math.round(double a)はlongを返します。Math.round(float a)はintを返します。 docs.oracle.com/javase/7/docs/api/java/lang/...
Hososugi

2
Math.round()は、(int)へのキャストと比較すると処理が遅い
darkgaze

186

実際には、達成したい結果に応じて、floatをintにダウンキャストする方法はいくつかあります(int i、floatの場合f)。

  • 丸め(指定された浮動小数点に最も近い整数)

    i = Math.round(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -3

    注:これは契約により、 (int) Math.floor(f + 0.5f)

  • 切り捨てる(つまり、小数点の後にすべてをドロップする)

    i = (int) f;
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
  • ceil / floor(小数部分がある場合は常に、指定された値よりも大きい/小さい整数)

    i = (int) Math.ceil(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  3 ; f =  2.68 -> i =  3
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -2 ; f = -2.68 -> i = -2
    
    i = (int) Math.floor(f);
      f =  2.0 -> i =  2 ; f =  2.22 -> i =  2 ; f =  2.68 -> i =  2
      f = -2.0 -> i = -2 ; f = -2.22 -> i = -3 ; f = -2.68 -> i = -3

正の値を丸めるには(int)(f + 0.5)、を使用することもできます。これはMath.Round、それらの場合とまったく同じように機能します(ドキュメントに従って)。

を使用Math.rint(f)て、最も近い偶数に丸めることもできます。厳密に.5に等しい小数部を持つ多くの浮動小数点数(IEEEの丸めの問題の可能性に注意してください)を処理し、セットの平均を維持したい場合は、間違いなく役立ちます。ただし、偶数が奇数よりも一般的である別のバイアスを導入します。

見る

http://mindprod.com/jgloss/round.html

http://docs.oracle.com/javase/6/docs/api/java/lang/Math.html

詳細と例については、


rintは銀行家の丸めです。これは、0.5を常に切り上げまたは切り下げた場合に発生する可能性があるエラーを減らすのに役立ちます。
プロファイラ

@prosfilaes表現を変更し、回答のその部分にWikiリンクを追加しました。


6

Math.roundは整数値も返すので、型キャストする必要はありません。

int b = Math.round(float a);

14
他の答えはすでにこれを言っています。新しい何かを追加する場合にのみ、新しい回答を追加してください。(また、Math.roundはintを返しません。)
Jeffrey Bosboom

1
彼は型キャストの必要がないことについて説明します(Sachithraの回答に対して)。ただし、コメントとして変換される場合があります。
Ranjith Kumar

5

Math.round(value)型キャスト後に整数にキャストしてから使用してください。

float a = 8.61f;
int b = (int)Math.round(a);

Math.round(float)はintを返します。なぜintへのキャストが必要なのかわかりません
Nephilim

-1

私に関しては、より簡単です: (int)(a +.5) // aはFloatです。丸められた値を返します。

Java Math.round()タイプに依存しない


4
これは、コードを分析する多くの開発者を混乱させます。丸められていることは明らかではありません。
ivan.panasiuk 2018

1
もちろん、それは基本的な数学です。試してみてください
Bruno L.

4
「基礎数学」は相対的な用語です。:)私の経験では、50%を超える開発者が、それが本当に丸められていることを理解していないことは間違いないでしょう。それは数学的には正しいですが、私が書いたように、それは明確ではなく、他の人がコードが何をするかを理解することは困難です。
ivan.panasiuk 2018

2
-(int) ( PI / 3 ):負であなたのコードを試してみてくださいa...とき以来-0.5のラウンドへ0

数値が負の場合は正しい-0.5を追加する必要がある
Bruno L.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.