如何使两个整数相除得到浮点数而不是另一个整数?

186

在另一个Bruce Eckels的计算速度的练习中,v = s / t,其中s和t是整数。我该如何使除法计算结果变成float类型?

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 v=(float)s/t 先转换为浮点数,然后执行除法。 - Juan Carlos Iturriagagoitia
9个回答

371

先将两个操作数中的一个转换为浮点数。

v = (float)s / t;

强制转换比除法的优先级更高,因此在除法之前发生。

另一个运算数将被编译器自动强制转换为浮点数,因为规则规定,如果任一操作数是浮点类型,则操作将是浮点操作,即使另一个操作数是整数。 Java Language Specification, §4.2.4§15.17


9
嗷,这花了我大约30分钟才找到并弄明白。如此简单。:D - Rihards
更具体地说,这个特定的规则在这里被提到:Multiplicative Operators,因此让它在这里留作将来参考。 - quantum
5
(对于任何后来遇到这个问题的人,给出的链接已经失效。新链接为:http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4 和 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17) - Steve Haley

18

尝试:

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

将整数转换为浮点数可以进行浮点数除法运算。
但实际上只需要转换其中一个即可。

1
我不知道,这就像是说你应该使用 long 类型而不是 int 类型。 - Jakub Zaverka

5

将整数转换为浮点数,以强制使用浮点数运算。否则,始终优先使用整数运算。因此:

代码示例:

int a = 5;
int b = 2;
float c = (float)a / b; // 强制使用浮点数运算

v = (float)s / t;

4
为了减少对代码可读性的影响,我建议:
v = 1d* s/t;

3
将其中一个或两个整数转换为浮点数,以强制使用浮点数运算。否则,整数运算将始终优先进行。因此,需要这样做:
1. v = (float)s / t;
2. v = (float)s / (float)t;

我懒得自己去弄,所以我搜索了一下。我发现需要对两个变量进行转换才能使其正常工作。所以这个方法很好用。 - Noah

3

您可以将分子或分母转换为浮点数...

整数运算通常返回整数,因此您必须更改其中一个操作数的类型。


2
通常情况下,如果它们返回结果,它们将返回 int 类型。 - Matthew Flaschen

3

您可以仅转换其中一个,但为了一致性,建议您明确转换两个,因此类似于 v = (float)s / (float)t 的语句应该能够正常工作。


2

JLS标准

JLS 7 15.17.2. 除法运算符 /规定:

整数除法向0取整。也就是说,对于经过二进制数值提升(§5.6.2)的整数操作数n和d,产生的商是一个整数值q,其大小尽可能大,同时满足| d · q | ≤ | n |。此外,当|n| ≥ |d|且n和d具有相同的符号时,q为正;但是当|n| ≥ |d|且n和d具有相反的符号时,q为负。

这就是为什么1/2不会得到一个浮点数的原因。

只需要将其中一个转换为浮点数,如(float)1/2即可,因为15.17. 乘法运算符 规定:

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

5.6.2. 二进制数值提升规定:

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

0

试试这个:

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

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