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


149

또 다른 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

float v = s / t는 나누기를 수행 한 다음 결과를 부동 소수점으로 변환합니다. float v = (float) s / t float로 캐스팅 한 다음 나누기를 수행합니다.
Juan Carlos Iturriagagoitia

답변:


307

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

v = (float)s / t;

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

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


8
Grrr, 내가 이것을 발견하고 알아낼 때까지 이것은 약 30 분이 걸렸다. 너무 간단합니다. : D
Rihards

보다 구체적으로,이 특정 규칙은 여기에 언급되어 있습니다 : 곱하기 연산자 이므로 나중에 참조 할 수 있도록 여기에 서십시오.
Quantum

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 )
Steve Haley

13

시험:

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

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

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


몰라, 그것은 당신이 정수 대신 long을 사용해야한다고 말하는 것과 같습니다.
Jakub Zaverka

4

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

v = (float)s / t;


3

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

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


1
보통? 그들이 전혀 돌아 오지 않으면 int로 돌아갑니다.
Matthew Flaschen

3

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


1

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로 변환됩니다.

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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.