【问题标题】:How to make the division of 2 ints produce a float instead of another int?如何使 2 个整数的除法产生一个浮点数而不是另一个整数?
【发布时间】:2009-04-24 21:50:06
【问题描述】:

在另一个 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 v=(float)s/t 转换为 float 然后执行除法。

标签: java


【解决方案1】:

首先将两个操作数之一转换为浮点数。

v = (float)s / t;

演员的优先级高于除法,所以发生在除法之前。

编译器将有效地自动将另一个操作数转换为浮点数,因为规则说如果任何一个操作数是浮点类型,那么该操作将是一个浮点操作,即使另一个操作数是整数。 Java Language Specification, §4.2.4§15.17

【讨论】:

【解决方案2】:

试试:

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

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

不过,你真的只需要施放一个。

【讨论】:

  • 我不知道,这就像说你应该使用longs而不是iof ints。
【解决方案3】:

将其中一个整数转换为浮点数以强制使用浮点数学来完成操作。否则整数数学总是首选。所以:

v = (float)s / t;

【讨论】:

    【解决方案4】:

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

    v = 1d* s/t;
    

    【讨论】:

      【解决方案5】:

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

      int 操作通常返回 int,因此您必须更改其中一个操作数。

      【讨论】:

      • 通常?如果它们完全返回,它们将返回 int。
      【解决方案6】:

      您甚至可以只转换其中一个,但为了保持一致性,您可能希望显式转换两者,这样 v = (float)s / (float)t 之类的东西应该可以工作。

      【讨论】:

        【解决方案7】:

        将整数之一/两个整数转换为浮点数以强制使用浮点数学来完成操作。否则整数数学总是首选。 所以:

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

        【讨论】:

          【解决方案8】:

          JLS 标准

          JLS 7 15.17.2. Division Operator / 说:

          整数除法向 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. Multiplicative Operators 说:

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

          5.6.2. Binary Numeric Promotion 说:

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

          【讨论】:

            【解决方案9】:

            试试这个:

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

            【讨论】:

              猜你喜欢
              • 2016-12-02
              • 2020-11-26
              • 1970-01-01
              • 1970-01-01
              • 2016-01-06
              相关资源
              最近更新 更多