java 如何使2个int的除法产生一个float而不是另一个int?

093gszye  于 2023-03-28  发布在  Java
关注(0)|答案(9)|浏览(612)

在另一个布鲁斯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
qlvxas9a

qlvxas9a1#

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

v = (float)s / t;

强制转换的precedence比除法高,所以在除法之前发生。
另一个操作数将被编译器有效地自动转换为浮点数,因为规则表明,如果其中一个操作数是浮点类型,则该操作将是浮点操作,即使另一个操作数是整数。Java语言规范,§4.2.4和§15.17

mbjcgjjk

mbjcgjjk2#

试试看:

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

将整型转换为浮点数将允许浮点除法发生。
但你真的只需要投一个。

bvhaajcl

bvhaajcl3#

将其中一个整数强制转换为浮点数,以强制使用浮点数学完成操作。否则,始终首选整数数学。因此:

v = (float)s / t;
xqkwcwgp

xqkwcwgp4#

为了减少对代码可读性的影响,我建议:

v = 1d* s/t;
ve7v8dk2

ve7v8dk25#

你可以将分子或分母转换为浮点数…
int运算通常返回int,因此必须更改其中一个操作数。

1qczuiv0

1qczuiv06#

你甚至可以只强制转换其中一个,但是为了一致性,你可能想显式地强制转换两者,所以像v =(float)s /(float)t这样的东西应该可以工作。

mspsb9vt

mspsb9vt7#

将其中一个整数/两个整数强制转换为float,以强制使用浮点数学完成操作。否则,始终首选整数数学。因此:

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

olhwl3o28#

JLS标准

JLS 7 15.17.2.部门运营商/说:
整数除法向0舍入。也就是说,对于二进制数字提升(§5.6.2)后为整数的操作数n和d产生的商是一个整数值q,其大小尽可能大,同时满足|d · q|不超过|n|此外,q为正,当|n|≥|d|并且n和d具有相同的符号,但是q是负的,当|n|≥|d|并且n和d具有相反的符号。
这就是为什么1/2不给予浮点数。
只将其中一个转换为浮点数就足够了,如(float)1/2,因为15.17.乘法运算符说:
对操作数执行二进制数字提升
and 5.6.2. Binary Numeric Promotion说道:

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

z4bn682m9#

试试这个:

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

相关问题