1. Math.round / Math.ceil / Math.floor
public class RoundTest {
public static void main(String[] args) {
double ABC = 1234.56789;
// 곱하기 몇을 하면, 나누기 몇을 하면 몇의 자리니 하는 식으로 생각하지 말고 소수점을 좌우로 밀고 당겨 반올림 하고 원래대로 밀고 당겨 복원시킨다는 개념으로 이해하자.
// 반올림
System.out.println(Math.round(ABC)); // 결과 : 1235
System.out.println(Math.round(ABC / 100) * 100); // 결과 : 1200
System.out.println(Math.round(ABC / 1000) * 1000); // 결과 : 1000
System.out.println(Math.round(ABC * 100) / 100.0); // 결과 : 1234.57 (반드시 100.0으로 나눠야한다. 안 그러면 소수점 아래가 날아감.)
System.out.println(Math.round(ABC * 1000) / 1000.0); // 결과 : 1234.568
System.out.println("");
// 올림
System.out.println(Math.ceil(ABC)); // 결과 : 1235.0
System.out.println(Math.ceil(ABC / 100) * 100); // 결과 : 1300.0
System.out.println(Math.ceil(ABC / 1000) * 1000); // 결과 : 2000.0
System.out.println(Math.ceil(ABC * 100) / 100.0); // 결과 : 1234.57
System.out.println(Math.ceil(ABC * 1000) / 1000.0); // 결과 : 1234.568
System.out.println("");
// 내림
System.out.println(Math.floor(ABC)); // 결과 : 1234.0
System.out.println(Math.floor(ABC / 100) * 100); // 결과 : 1200.0
System.out.println(Math.floor(ABC / 1000) * 1000); // 결과 : 1000.0
System.out.println(Math.floor(ABC * 100) / 100.0); // 결과 : 1234.56
System.out.println(Math.floor(ABC * 1000) / 1000.0); // 결과 : 1234.567
System.out.println("");
}
}
여기서 키 포인트는 곱하기, 나누기의 개념이 아니라 소수점을 좌우로 밀고 당긴다는 개념으로 이해하자!!
2. 자릿수 맞추기
1 ) 정수 자릿수 맞추기
학생 성적표가 있다고 하자. 어떤 사람은 90점, 어떤 사람은 80점, 어떤 사람은 100점이라면 일반적으로 표현을 하면 다음과 같이 출력된다.
뚜비의 점수는 : 90
나나의 점수는 : 80
둘리의 점수는 : 100
이걸 동일한 모양으로 맞추고 싶다면 어떻게 해야할까?
뚜비의 점수는 : 90
나나의 점수는 : 80
둘리의 점수는 : 100
이렇게 숫자를 앞에 공백을 포함해 3자리로 맞춰주면 됩니다. 엑셀에 있는 셀서식처럼 말이죠.
System.out.println(ABC); 를
System.out.println(String.format("%3d", ABC)); 이렇게 String.format()을 이용해 자릿수를 맞춰주면 됩니다.
만약, 출력할 값이나 변수가 2개 이상이라면 아래와 같이 사용하면 된다.
System.out.println(String.format("%3d, %3d", ABC, DEF));
public class RoundTest {
public static void main(String[] args) {
// 정수 자릿수 맞추기
int AAA = 123;
int AAAA = 1234;
int AAAAA = 12345;
System.out.println(AAA);
System.out.println(AAAA);
System.out.println(String.format("%4d", AAA));
System.out.println(AAAAA);
System.out.println(String.format("%5d", AAA));
}
}
결과 :
123
1234
123
12345
123
2 ) 실수 자릿수 맞추기
마찬가지로 실수의 자릿수도 이렇게 맞춰줄 수 있습니다. 이때 실수는 메소드 특성상 이하 자릿수는 반올림 처리를 해버립니다.
실수는 정수와 다르게 생각해야 할 개념이 하나 더 늘어납니다. 아니 정확히는 생각해야 할 개념이 아니라 컴퓨터가 어떻게 생각하는지를 배우는거죠. 예제를 보면 이해가 쉽습니다.
public class RoundTest {
public static void main(String[] args) {
double DDD = 123.4567;
System.out.println(String.format("%.2f", DDD)); // 소수점 2자리까지 표현 + (소수점 3번째 자리에서 반올림)
System.out.println(String.format("%10.2f", DDD)); // 소수점 2자리까지 표현 + 자릿수 10자리까지 표현
}
}
%.2f 를 하면 12.34567은 소수점 2자리까지 표현됩니다. 따라서, 소수점 3번째 자리에서 반올림 처리가 되어 12.35가 됩니다.
그렇다면 앞에 정수 부분은 3자리로 표현하고, 소수점 2자리에서 끊고 싶다면 어떻게 해야할까요?
%3.2f 를 하면 될까요? No!
컴퓨터가 자릿수를 어떻게 계산할까 컴퓨터처럼 생각해봐야합니다. 컴퓨터는 사람처럼 12.34567은 12라는 정수와 소수점 이하 .4567이 결합된거야! 라고 따로 분리해서 생각하지 않습니다.
int면 그냥 무조건 정수!
double이면 그냥 무조건 실수!
인 것이지요. double로 선언하면 10도 10.0이라는 실수로 생각하는 것과 같습니다.
12.34567을 ' 12.35'로 만들고 싶다면, '전체 자릿수 = 정수 자릿수(3) + 소수점 '.'(1) + 실수 자릿수(2) = 6' 을 하면 됩니다.
%6.2f 를 해야 하는 것이지요!!
예제로 살펴봅시다.
public class RoundTest {
public static void main(String[] args) {
double DDD = 12.34567;
System.out.println(String.format("%.2f", DDD)); // 소수점 2자리까지 표현 + (소수점 3번째 자리에서 반올림)
System.out.println(String.format("%6.2f", DDD)); // 소수점 2자리까지 표현 + 자릿수 10자리까지 표현
}
}
결과 :
12.35
12.35
3 ) 문자열 자릿수 맞추기
public class RoundTest {
public static void main(String[] args) {
String CC = "Hello";
System.out.println(CC);
System.out.println(String.format("%6s", CC));
}
}
결과 :
Hello
Hello
정리해보면 다음과 같습니다.
%3d : 정수를 3자리로 맞춘다.
%.3f : 소수점을 3자리로 맞춘다. (따라서 4번째 자리에서 반올림을 한다!!) -> 원래 반올림을 위한 메소드는 아니지만 이런 특성을 이용해 소수점의 경우 반올림으로 이용할 수도 있다.
%3s : 문자열을 3자리로 맞춘다.
이 외에도 %?x, %?o는 각각 16진수, 8진수를 표현할 수 있습니다.
단, 사용시 주의해야 할 점은 2개 이상의 값을 출력할 때 옵션으로 주는 부분을 각각 " " 로 묶으면 안 됩니다.
System.out.println(String.format("%4d", "%4d", AAA, BBB)); X
System.out.println(String.format("%4d, %4d", AAA, BBB)); O
Java (자바) String Formatting (문자열 포맷팅)과 파이썬 포맷팅을 비교해봅시다.
2020/05/05 - [개발자/Python] - Python (파이썬) String Formatting (문자열 포맷팅)
'개발자 > Java' 카테고리의 다른 글
Java (자바) 학생들 클래스 모으기 (서로 다른 클래스를 일반화 시키기) (0) | 2020.05.07 |
---|---|
Java (자바) Abstract, @Override (0) | 2020.04.25 |
Java (자바) 플레이어와 몬스터 대전 게임 만들기 (0) | 2020.04.22 |
Java (자바) 상속, 객체데이터를 이용한 문제 - 학생, 선생, 매점 직원 (0) | 2020.04.22 |
Java (자바) 프로젝트 가져오기 (Import) (0) | 2020.04.21 |