2011-11-16 3 views
1

정수 계산에서 3 * (2/3) = 2이지만 3 * (2/3) = 0을 계산해야한다고 가정합니다. 그래서 부동 소수점 연산 3 * (2.0/3) = 2.0을 사용해야합니다. 부동 소수점 결과는 int입니다.자바에서 정수 표현을 계산하는 방법

의미가 있습니까? 어떻게 여기 캐스팅을 피 하시겠습니까?

+3

(3 * 2)/3과 같이 공리를 움직일 수 없습니까? – Tudor

답변

1

캐스팅을 피할 수 없습니다. 정수 나눗셈을 사용할 수도 있고 전체 나누기를 사용할 수도 있지만 인수와 결과는 부동 소수점을 사용합니다. 표현 부분을 이동하여 정수 구분을 최상위 수준으로 가져올 수 있습니다. 귀하의 경우 3 * (2/3)(3 * 2)/3으로 변환하면 부동 소수점 연산없이 2가됩니다.

5

이 특정 예에서는 표현식을 3 * 2/3 또는 3/3 * 2으로 재 배열하는 것이 더 좋습니다. 이렇게하면 정수 연산만으로도 정확한 결과를 얻을 수 있습니다.

부동 소수점 연산을 사용하는 것이 더 일반적인 솔루션이지만 반올림 문제를 인식하고 있어야합니다. 일반적으로 xy이 부동 소수점 수인 경우 x * (y/x)은 정확히 y을 제공하지 않을 것입니다.

이 결과는 정수 것을 알고, 또는 단순히 가장 가까운 정수로 반올림하려면

, 당신은 Math.round() 사용할 수 있습니다

Math.round(3 * (2f/3)) 

단순히 int에 결과가 좋은 생각이 아니다 캐스팅 부동 소수점 수는 정확하지 않으므로 이러한 캐스트는 숫자를 자르면이됩니다.

1

*/의 우선 순위가 같으므로 괄호를 생략하면 올바른 결과가 제공됩니다.

그렇지 않으면 캐스팅 (또는 절단)이 불가피합니다.

3/3 * 2 = 2 

을하지만 그게 전부 당신이 필요 확실하지 :

1

필자는 개인적으로 방정식을 재 배열한다. float의 계산을 시도한 다음 round()를 사용하여 가장 가까운 정수로 반올림하거나 반올림합니다.

1

이것은 정수 나누기 때문입니다. 이런 종류의 표현식에서는 float를 사용하는 것이 좋습니다.

복합 연산자를 사용하는 경우에만 명시 적 전송을 피할 수 있습니다. 복합 연산자는 자동 캐스팅을 수행합니다.

int a = 3; 
a *= (2.0/3); 
System.out.println(a); 
0

달성하고자하는 목표는 무엇입니까? 정수 계산을 사용하면 결과는} 호를 설정 한 위치에 따라 다 (니다. (a/b) * (c/d) * (e/f)은 수학적으로 두 표현식이 같더라도 일반적으로 (a*c*d)/(b*d*f)과 다른 결과가 있음을 눈치 챘을 것입니다. 둘 사이의 표현은 해결하려는 작업에 따라 다를 수 있습니다. 나는 이것에 대한 명확한 진술을 놓친다.

수학적으로 정확한 값에 가장 가까운 정수를 찾으려면 nominator와 denominator를 별도로 계산 한 다음 나누기를 수행하십시오. 이 방법은 중간 오류가 발생하지 않습니다. 그렇지 않으면 질문을 다시 정리할 필요가 있습니다.

관련 문제