【问题标题】:How to convert float to int with Java如何使用 Java 将 float 转换为 int
【发布时间】:2010-11-20 16:37:50
【问题描述】:

我使用以下行将 float 转换为 int,但它并不像我想要的那样准确:

 float a=8.61f;
 int b;

 b=(int)a;

结果是:8(应该是9

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

最好的方法是什么?

【问题讨论】:

  • 我应该指出,只是类型转换会截断值,并且不会对值执行任何舍入/取整操作。

标签: java floating-point int


【解决方案1】:

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

【讨论】:

  • 为什么在 Math.round() 之后需要 typecast?
  • Math.round() 返回 int 值,因此使用 (int) 进行类型转换是多余的。
  • 使用其中一个/或... (int)foo 更简单。
  • Solvek 的回答是对的,但我想指出 Math.round() 根据输入可以有两种不同的输出类型。 Math.round(double a) 返回一个长整数。 Math.round(float a) 返回一个整数。 docs.oracle.com/javase/7/docs/api/java/lang/…
  • Math.round() 与转换为 (int) 相比是一个缓慢的操作
【解决方案2】:

实际上,有不同的方法可以将float向下转换为int,具体取决于您要达到的结果: (对于 int i,float f

  • round(与给定浮点数最接近的整数)

    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)来做rounding to the nearest even integer;如果您希望处理大量小数部分严格等于 0.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 链接。
【解决方案3】:

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

使用

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

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

【讨论】:

    【解决方案4】:

    使用Math.round(value),然后在类型转换为整数之后。

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

    【讨论】:

    • Math.round(float) 返回一个 int,我不确定为什么需要强制转换为 int
    【解决方案5】:

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

    int b = Math.round(float a);
    

    【讨论】:

    • 其他答案已经说了。请仅在您要添加新内容时添加新答案。 (另外,Math.round 不返回 int。)
    • 他解释了不需要类型转换(对 Sachithra 的回答)。但它可能会被转换为评论。
    【解决方案6】:

    对我来说,更简单:(int) (a +.5) // a 是一个浮点数。返回四舍五入的值。

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

    【讨论】:

    • 这会让很多分析代码的开发者感到困惑。不清楚它是否四舍五入。
    • 当然是,只是基础数学,试试看
    • “基础数学”是一个相对术语。 :) 根据我的经验,我敢打赌,超过 50% 的开发人员不会理解它真的是四舍五入。它在数学上是正确的,但正如我写的那样,它并不清楚,其他人很难理解代码的作用。
    • -(int) ( PI / 3 ):用否定的a 尝试你的代码...因为当-0.5 轮到0
    • 你是对的,如果数字是负数,你必须加 -0.5
    【解决方案7】:

    如果您想将浮点值转换为整数值,您有几种方法可以做到这一点,具体取决于您希望如何对浮点值进行四舍五入。

    第一种方法是对浮点值进行四舍五入:

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

    此代码的输出将是 3,即使 myFloat 值更接近 4。

    第二种方式是ceil对float值进行四舍五入:

    float myFloat = 3.14f;
    int myInteger = Math.ceil(myFloat);
    

    此代码的输出将是 4,因为舍入模式总是在寻找最大值。

    【讨论】:

      【解决方案8】:

      Math.round() 就足够了

      int b = Math.round(a)
      

      这将完成工作

      【讨论】:

      • 是的,接受的答案说要做同样的事情。
      【解决方案9】:

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

      Explanation
      Since number wrapper classes extend the java.lang.Number class, you can have any number wrapper object return any other number primitive type by using the .<type>Value() method.

      步骤

      1. 创建一个浮点对象
      2. 使用.intValue() 方法返回原语int

      示例

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        • 2013-12-16
        • 2012-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多