[java] 2 정수를 나누면 다른 정수 대신 부동 소수점을 생성하는 방법은 무엇입니까?

또 다른 Bruce Eckels에서 속도를 계산하는 연습에서 v = s / ts와 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



답변

두 피연산자 중 하나를 먼저 부동 소수점으로 캐스팅하십시오.

v = (float)s / t;

캐스트는 나누기보다 우선 순위가 높으므로 나누기 전에 발생합니다.

다른 피연산자가 정수인 경우에도 규칙에 따라 피연산자 중 하나가 부동 소수점 유형 인 경우 연산이 부동 소수점 연산이되기 때문에 다른 피연산자는 컴파일러에 의해 부동 소수점으로 효과적으로 자동 캐스트됩니다. Java 언어 사양, §4.2.4§15.17


답변

시험:

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

정수를 부동 소수점으로 캐스팅하면 부동 소수점 분할이 발생할 수 있습니다.

그래도 하나만 캐스팅하면됩니다.


답변

부동 소수점 수학으로 연산을 수행하도록 정수 중 하나를 부동 소수점으로 캐스트하십시오. 그렇지 않으면 정수 수학이 항상 선호됩니다. 그래서:

v = (float)s / t;


답변

코드 준비에 대한 영향을 줄이려면 다음을 제안합니다.

v = 1d* s/t;


답변

분자 또는 분모를 캐스트하여 부동으로 만들 수 있습니다.

int 연산은 일반적으로 int를 반환하므로 피연산자 숫자 중 하나를 변경해야합니다.


답변

둘 중 하나만 캐스팅 할 수 있지만 일관성을 위해 v = (float) s / (float) t와 같은 것을 명시 적으로 캐스팅하고 싶을 수도 있습니다.


답변

JLS 표준

JLS 7 15.17.2. 부서 운영자 / 말한다 :

정수 나누기는 0으로 반올림됩니다. 즉, 이진 숫자 승격 후 정수인 피연산자 n 및 d에 대해 생성 된 몫 (§5.6.2)은 | d · q |를 만족시키면서 크기가 가능한 큰 정수 값 q입니다. ≤ | n |. 또한, | n | ≥ | d | n과 d는 같은 부호를 갖지만 | n | ≥ | d | n과 d는 반대의 부호를 가진다.

이것이 1/2플로트를 제공하지 않는 이유 입니다.

15.17부터는 하나만 부동으로 변환 (float)1/2하면 충분 합니다. 곱하기 연산자의 말 :

피연산자에서 이진 숫자 승격이 수행됩니다.

5.6.2. 이진 숫자 승진 은 말합니다 :

  • 피연산자 중 하나가 double 유형이면 다른 피연산자는 double로 변환됩니다.
  • 그렇지 않으면, 피연산자 중 하나가 float 유형 인 경우, 다른 피연산자가 float로 변환됩니다.