또 다른 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
답변
두 피연산자 중 하나를 먼저 부동 소수점으로 캐스팅하십시오.
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로 변환됩니다.