如何使2个整数的除法产生一个浮点数而不是另一个整数?


148

在另一个Bruce Eckels演习中,计算速度,v = s / t其中s和t是整数。我如何做到这一点,以便该部门提高浮力?

class CalcV {
  float v;
  float calcV(int s, int t) {
    v = s / t;
    return v;
  } //end calcV
}

public class PassObject {

  public static void main (String[] args ) {
    int distance;
    distance = 4;

    int t;
    t = 3;

    float outV;

    CalcV v = new CalcV();
    outV = v.calcV(distance, t);

    System.out.println("velocity : " + outV);
  } //end main
}//end class

float v = s / t执行除法,然后将结果转换为float。float v =(float)s / t强制转换为float然后执行除法。
Juan Carlos Iturriagagoitia,

Answers:


305

只需将两个操作数之一先转换为浮点数即可。

v = (float)s / t;

演员表的优先级高于分区,因此发生在分区之前。

另一个操作数将由编译器自动有效地强制转换为浮点数,因为规则说,如果另一个操作数为浮点型,则即使另一个操作数是整数,该操作也将是浮点运算。 Java语言规范§4.2.4§15.17


8
Grrr,这花了我大约30分钟的时间,直到我发现并弄清楚了。很简单。:D
Rihards

更具体地说,这里提到了该特定规则:乘法运算符,因此请在此处站立以备将来参考。
量子

5
(对于以后遇到此问题的任何人,给定的链接都将断开。新的链接为:docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4docs。 oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17)–
史蒂夫·海莉

13

尝试:

v = (float)s / (float)t;

将整数转换为浮点数将允许进行浮点除法。

不过,您实际上只需要投射一个即可。


我不知道,这就像是说您应该使用long代替iof ints。
雅各布·扎维卡

4

将整数之一强制转换为浮点数,以强制执行浮点数学运算。否则,始终首选整数数学。所以:

v = (float)s / t;



3

您甚至可以只强制转换其中之一,但是为了保持一致性,您可能希望显式地同时强制转换两者,这样v =(float)s /(float)t之类的方法就可以工作。


1

JLS标准

JLS 7 15.17.2。部门负责人/说:

整数除法将取整为0。即,为二进制二进位(第5.6.2节)之后的整数的操作数n和d所产生的商是一个整数值q,其大小应尽可能大,同时满足| d·q | ≤| n |。此外,当| n |时,q为正。≥| d | 和n和d具有相同的符号,但是| n |时q为负。≥| d | n和d具有相反的符号。

这就是为什么 1/2不浮动。

(float)1/2由于15.17,只需将其中之一转换为浮点就足够了乘法运算符说:

对操作数执行二进制数值提升

5.6.2。二进制数值促销说:

  • 如果一个操作数的类型为double,则另一个将转换为double。
  • 否则,如果其中一个操作数的类型为float,则另一个将转换为float

0

将整数之一或整数两者都强制转换为浮点数,以强制执行浮点运算。否则,始终首选整数Math。所以:

1. v = (float)s / t;
2. v = (float)s / (float)t;

0

试试这个:

class CalcV 
{
      float v;
      float calcV(int s, int t)
      {
          float value1=s;
          float value2=t;
          v = value1 / value2;
          return v;
      } //end calcV
}
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.