정수 계산에서 3 * (2/3) = 2
이지만 3 * (2/3) = 0
을 계산해야한다고 가정합니다. 그래서 부동 소수점 연산 3 * (2.0/3) = 2.0
과 을 사용해야합니다. 부동 소수점 결과는 int
입니다.자바에서 정수 표현을 계산하는 방법
의미가 있습니까? 어떻게 여기 캐스팅을 피 하시겠습니까?
정수 계산에서 3 * (2/3) = 2
이지만 3 * (2/3) = 0
을 계산해야한다고 가정합니다. 그래서 부동 소수점 연산 3 * (2.0/3) = 2.0
과 을 사용해야합니다. 부동 소수점 결과는 int
입니다.자바에서 정수 표현을 계산하는 방법
의미가 있습니까? 어떻게 여기 캐스팅을 피 하시겠습니까?
캐스팅을 피할 수 없습니다. 정수 나눗셈을 사용할 수도 있고 전체 나누기를 사용할 수도 있지만 인수와 결과는 부동 소수점을 사용합니다. 표현 부분을 이동하여 정수 구분을 최상위 수준으로 가져올 수 있습니다. 귀하의 경우 3 * (2/3)
을 (3 * 2)/3
으로 변환하면 부동 소수점 연산없이 2가됩니다.
이 특정 예에서는 표현식을 3 * 2/3
또는 3/3 * 2
으로 재 배열하는 것이 더 좋습니다. 이렇게하면 정수 연산만으로도 정확한 결과를 얻을 수 있습니다.
부동 소수점 연산을 사용하는 것이 더 일반적인 솔루션이지만 반올림 문제를 인식하고 있어야합니다. 일반적으로 x
및 y
이 부동 소수점 수인 경우 x * (y/x)
은 정확히 y
을 제공하지 않을 것입니다.
, 당신은 Math.round()
사용할 수 있습니다
Math.round(3 * (2f/3))
단순히 을 int
에 결과가 좋은 생각이 아니다 캐스팅 부동 소수점 수는 정확하지 않으므로 이러한 캐스트는 숫자를 자르면이됩니다.
*
및 /
의 우선 순위가 같으므로 괄호를 생략하면 올바른 결과가 제공됩니다.
그렇지 않으면 캐스팅 (또는 절단)이 불가피합니다.
3/3 * 2 = 2
을하지만 그게 전부 당신이 필요 확실하지 :
필자는 개인적으로 방정식을 재 배열한다. float의 계산을 시도한 다음 round()를 사용하여 가장 가까운 정수로 반올림하거나 반올림합니다.
이것은 정수 나누기 때문입니다. 이런 종류의 표현식에서는 float를 사용하는 것이 좋습니다.
복합 연산자를 사용하는 경우에만 명시 적 전송을 피할 수 있습니다. 복합 연산자는 자동 캐스팅을 수행합니다.
int a = 3;
a *= (2.0/3);
System.out.println(a);
달성하고자하는 목표는 무엇입니까? 정수 계산을 사용하면 결과는} 호를 설정 한 위치에 따라 다 (니다. (a/b) * (c/d) * (e/f)
은 수학적으로 두 표현식이 같더라도 일반적으로 (a*c*d)/(b*d*f)
과 다른 결과가 있음을 눈치 챘을 것입니다. 둘 사이의 표현은 해결하려는 작업에 따라 다를 수 있습니다. 나는 이것에 대한 명확한 진술을 놓친다.
수학적으로 정확한 값에 가장 가까운 정수를 찾으려면 nominator와 denominator를 별도로 계산 한 다음 나누기를 수행하십시오. 이 방법은 중간 오류가 발생하지 않습니다. 그렇지 않으면 질문을 다시 정리할 필요가 있습니다.
(3 * 2)/3과 같이 공리를 움직일 수 없습니까? – Tudor