반응형
정수 나누기를 반올림하고 Java에서 int 결과를 얻는 방법은 무엇입니까?
이 질문에 이미 답변이 있습니다.
휴대 전화 SMS의 페이지 수를 세는 아주 작은 방법을 썼습니다. 를 사용하여 반올림 할 수있는 옵션이 없었고 Math.ceil
솔직히 매우 추한 것 같습니다.
내 코드는 다음과 같습니다.
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String message = "today we stumbled upon a huge performance leak while optimizing a raycasting algorithm. Much to our surprise, the Math.floor() method took almost half of the calculation time: 3 floor operations took the same amount of time as one trilinear interpolation. Since we could not belive that the floor-method could produce such a enourmous overhead, we wrote a small test program that reproduce";
System.out.printf("COunt is %d ",(int)messagePageCount(message));
}
public static double messagePageCount(String message){
if(message.trim().isEmpty() || message.trim().length() == 0){
return 0;
} else{
if(message.length() <= 160){
return 1;
} else {
return Math.ceil((double)message.length()/153);
}
}
}
저는이 코드가별로 마음에 들지 않으며보다 우아한 방법을 찾고 있습니다. 이것으로 나는 3.0000000이 아니라 3을 기대하고 있습니다. 어떤 아이디어?
정수 나눗셈을 반올림하려면 다음을 사용할 수 있습니다.
import static java.lang.Math.abs;
public static long roundUp(long num, long divisor) {
int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1);
return sign * (abs(num) + abs(divisor) - 1) / abs(divisor);
}
또는 두 숫자가 모두 양수이면
public static long roundUp(long num, long divisor) {
return (num + divisor - 1) / divisor;
}
Math.ceil()
결과를 사용 하고 int로 캐스트하십시오.
- 이것은 abs ()를 사용하여 복식을 피하는 것보다 더 빠릅니다.
- -0.999는 0으로 반올림되므로 결과는 음수로 작업 할 때 정확합니다.
예:
(int) Math.ceil((double)divident / divisor);
너무 복잡하지 않은 또 다른 한 줄 :
private int countNumberOfPages(int numberOfObjects, int pageSize) {
return numberOfObjects / pageSize + (numberOfObjects % pageSize == 0 ? 0 : 1);
}
int 대신 long을 사용할 수 있습니다. 매개 변수 유형과 반환 유형을 변경하기 만하면됩니다.
Google의 Guava 라이브러리 는 IntMath 클래스에서이를 처리합니다 .
IntMath.divide(numerator, divisor, RoundingMode.CEILING);
여기의 많은 답변과 달리 음수를 처리합니다. 또한 0으로 나누려고 할 때 적절한 예외가 발생합니다.
(message.length() + 152) / 153
이것은 "반올림 된"정수를 제공합니다.
long numberOfPages = new BigDecimal(resultsSize).divide(new BigDecimal(pageSize), RoundingMode.UP).longValue();
a를 b로 반올림하여 계산하려면 (a + (-a % b)) / b를 사용할 수 있습니다.
Peter의 솔루션을 확장하면 다음과 같이 항상 '양의 무한대로'반올림 할 수 있습니다.
public static long divideAndRoundUp(long num, long divisor) {
if (num == 0 || divisor == 0) { return 0; }
int sign = (num > 0 ? 1 : -1) * (divisor > 0 ? 1 : -1);
if (sign > 0) {
return (num + divisor - 1) / divisor;
}
else {
return (num / divisor);
}
}
이것은 도움이 될 수 있습니다, 나머지를 legnth로 빼서 나눌 수있는 숫자로 만든 다음 153으로 나눕니다.
int r=message.length()%153; //Calculate the remainder by %153
return (message.length()-r)/153; // find the pages by adding the remainder and
//then divide by 153
반응형
'Programing' 카테고리의 다른 글
UITapGestureRecognizer-터치 업이 아닌 터치 다운에서 작동하도록 하시겠습니까? (0) | 2020.10.11 |
---|---|
코드 변경없이 "컴파일러 필수 멤버 누락"오류가 여러 번 발생 함 (0) | 2020.10.11 |
Android에서 버튼과 같은 이미지보기 클릭 효과를 제공하려면 어떻게해야합니까? (0) | 2020.10.11 |
포드 설정을 실행하면 "잘못된 인터프리터 : 해당 파일이나 디렉토리가 없습니다." (0) | 2020.10.11 |
C 전처리기를 사용하여 int를 문자열에 연결 (0) | 2020.10.10 |