如何使用Java将float转换为int


342

我使用以下行将float转换为int,但是它不如我所希望的那么准确:

 float a=8.61f;
 int b;

 b=(int)a;

结果是:(8应该是9

当时a = -7.65f,结果为:(-7应该为-8

最好的方法是什么?


16
我应该指出,仅类型转换会截断该值,并且不会对该值执行任何舍入/除法运算。
Brian Graham 2012年

Answers:


678

使用Math.round()会将浮点数舍入到最接近的整数。


1
为什么在Math.round()之后需要进行类型转换?
死灵法师2012年

81
Math.round()返回int值,因此使用typecasting (int)是多余的。
Solvek

5
使用/或... (int)foo更简单。
yuttadhammo 2012年

31
Solvek的答案是正确的,但我想指出,Math.round()可以基于输入具有两种不同的输出类型。Math.round(double a)返回一个long。Math.round(float a)返回一个int。 docs.oracle.com/javase/7/docs/api/java/lang/...
Hososugi

2
与强制转换为(int)相比,Math.round()是一个缓慢的操作
darkgaze

186

实际上,有多种方法可以将float转换为int,具体取决于您要实现的结果:(对于int i,float f

  • 舍入(最接近给定float的整数)

    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在这种情况下(按doc)完全一样。

你也可以用Math.rint(f)四舍五入到最接近的偶数 ; 如果您希望处理小数部分严格等于.5的浮点数(请注意可能的IEEE舍入问题),并且希望将集合的平均值保持在适当位置,则可以说这很有用。您将引入另一个偏见,不过偶数比奇数更常见。

看到

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

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

有关更多信息和一些示例。


林特是银行家的四舍五入;如果您持续向上或向下舍入0.5,则有助于减少可能出现的错误。
prosfilaes

@prosfilaes我更改了措辞并在答案的那部分添加了Wiki链接。


6

Math.round还返回整数值,因此您无需进行类型转换。

int b = Math.round(float a);

13
其他答案已经说明了这一点。仅当您要添加新内容时,才添加新答案。(此外,Math.round不会返回整数。)
Jeffrey Bosboom 2015年

1
他给出了关于不需要打字的解释(对Sachithra的回答)。但是它可能会转换为注释。
Ranjith Kumar

5

Math.round(value)在将其强制转换为整数后使用。

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

Math.round(float)返回一个int,我不确定为什么要
强制转换

-1

对我来说,更容易:(int)(a +.5) // a是浮点数。返回舍入值。

不依赖于Java Math.round()类型


4
这会使很多分析代码的开发人员感到困惑。尚不清楚它是四舍五入的。
ivan.panasiuk '18

1
当然,这只是基础数学,只需尝试
Bruno L.

4
“基础数学”是一个相对术语。:)根据我的经验,我敢打赌,超过50%的开发人员不会理解它确实是四舍五入的。从数学上讲这是正确的,但是正如我所写的那样,目前尚不清楚,其他人很难理解代码的作用。
ivan.panasiuk

2
-(int) ( PI / 3 ):尝试使用负数代码a...因为-0.5四舍五入到0什么时候?

如果数字为负数,那么您是对的,您必须添加-0.5来代替
Bruno L.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.