如何使用Java将浮点数转换为整数

426
我用以下代码将浮点数转换为整数,但精度不够高:
 float a=8.61f;
 int b;

 b=(int)a;

结果是:8(应该是9

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

最好的方法是什么?


18
需要翻译的内容:I should point out that just typecasting truncates the value and does not perform any rounding/flooring operations on the value.我的翻译:我应该指出,仅仅进行类型转换会截断数值,而不会对数值执行任何舍入/向下取整操作。 - Nahydrin
将0.5f加到一个数上。 - Tom
9个回答

788

使用Math.round()方法可以将浮点数四舍五入为最接近的整数。


1
为什么在Math.round()之后需要类型转换? - necromancer
87
Math.round() 返回一个 int 值,所以使用 (int) 进行类型转换是多余的。 - Solvek
6
使用either/or语句时,“(int)foo”更简洁。 - yuttadhammo
39
Solvek的答案正确,但我想指出Math.round()根据输入可以有两种不同的输出类型。Math.round(double a)返回long类型。 Math.round(float a)返回int类型。http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html#round(double) - Hososugi
3
与强制转换为(int)相比,Math.round()操作较慢。 - Darkgaze
@darkgaze 你知道你在提倡一种效率差异吗?这种差异在99.99%的应用程序中并不重要,对吧?而且,有了JIT内联,只要HotSpot开始运行,它几乎不会慢。 - user719662

209

实际上,将浮点数下转换为整数有不同的方法,具体取决于您想要实现的结果:(对于 int i,float f

  • round (the closest integer to given 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
    

    note: this is, by contract, equal to (int) Math.floor(f + 0.5f)

  • truncate (i.e. drop everything after the decimal dot)

    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 (an integer always bigger/smaller than a given value if it has any fractional part)

    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
@prosfilaes 我已经改变了措辞并添加了一个维基链接到答案的部分。 - user719662

16

Math.round(value) 将值四舍五入为最接近的整数。

使用

1) b=(int)(Math.round(a));

2) a=Math.round(a);  
   b=(int)a;

13

通过将一个float原始类型传递给构造函数来实例化一个Float对象,然后使用您创建的Float对象返回一个int原始类型。

Explanation
由于数字包装类扩展了java.lang.Number类,因此您可以使用.<type>Value()方法让任何数字包装对象返回任何其他数字原始类型

步骤

  1. 创建一个Float对象
  2. 使用.intValue()方法返回一个原始的int

示例

Float mFloat = Float.valueOf(8.65f);
int i = mFloat.intValue();

8

使用Math.round()就足够了

int b = Math.round(a)

这将完成工作。

1
是的,被接受的答案建议做同样的事情。 - Null

7

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

int b = Math.round(float a);

15
其他回答已经提到了这一点。当您有新内容要添加时,请仅添加新答案。(另外,Math.round不返回int。) - Jeffrey Bosboom
1
他对Sachithra的回答解释了不需要进行类型转换。但它可能会被转换为注释。 - Ranjithkumar

7
使用Math.round(value)将值四舍五入,然后转换为整数。
float a = 8.61f;
int b = (int)Math.round(a);

Math.round(float) 返回一个整数,我不确定为什么需要强制转换为整数。 - Nephilim

4

如果您想将浮点值转换为整数值,有几种方法可供选择,这取决于您希望如何舍入浮点值。

第一种方法是向下舍入浮点值:

float myFloat = 3.14f;
int myInteger = (int)myFloat;

这段代码的输出结果将会是3,即使myFloat的值更接近4。
第二种方法是对浮点数进行向上取整:
float myFloat = 3.14f;
int myInteger = Math.ceil(myFloat);

这段代码的输出结果将是4,因为四舍五入模式总是寻找最高的值。

-2

对我来说,更简单的方法是:(int) (a + .5) // 这里 a 是浮点数,返回四舍五入后的整数值。

不依赖于 Java 中的 Math.round() 函数类型


4
这会让分析代码的开发人员感到困惑。不清楚这是四舍五入。 - ivan.panasiuk
1
当然是的,这只是基本数学,试一试就知道了。 - Bruno L.
4
“基本数学”是一个相对的术语。根据我的经验,我敢打赌超过50%的开发人员不会理解它实际上是四舍五入。虽然在数学上是正确的,但正如我所写的,它并不清晰,让其他人难以理解代码的含义。 - ivan.panasiuk
2
“-(int) ( PI / 3 )”:尝试使用负数的 a 运行您的代码...自从什么时候 -0.5 被四舍五入为 0 - user719662
1
如果这个数字是负数,那么你需要加上-0.5。 - Bruno L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接