[Java] 소수점을 %로 변경하는 두가지 방법
- Stackoverflow/Java
- 2023. 11. 8.
자바(Java)에서 숫자를 퍼센트(%) 형식으로 표시하려면 일반적으로 NumberFormat 형식과 고전적으로 값을 곱하는 방식이 존재하는데요. 두가지의 방법의 차이와 NumberFormat 사용법에 대해서 알려드리도록 하겠습니다.
비교할 데이터
public class TestMain {
public static void main(String[] args) {
double a = 0.23;
double b = 0.045;
double c = 0.00713;
}
}
명확한 값의 차이를 알기 위해, 위와 같이 3가지의 값을 지정해봤습니다.
고전적인 방식
퍼센트값은 당연하게도 0~1의 사이인 값으로 되어 있습니다. 이렇게 값이 정해져있기 때문에 퍼센트로 치환하는 방식 역시 생각보다 쉬울 수 있는데요.
/**
* 고전적인 방법
*/
public static void type1(double value) {
int quoatient = (int)(value * 100);
System.out.println("type1->" + quoatient + "%");
}
위와 같이 double 형태의 값에 100을 곱해주면 됩니다. 이 방식은 간단하게 퍼센트를 구할수 있는 장점이 있지만, 핸들링을 하려면 복잡해 지는 문제가 있는데요.
자바는 내장 함수로 이를 쉽게 핸들링할 수 있는 NumberFormat이라는 클래스를 제공해 줍니다.
NumberFormat 방식
넘버 포맷 방식은 퍼센트(%) 뿐만 아니라 각국의 통화, 소수 등의 형식으로 포맷하는 메소드를 제공하는데요. 본 포스팅은 퍼센트만 구할 예정이니 해당 방식을 사용법을 알아보도록 하겠습니다.
/**
* NumberFormat 방법
*/
public static void type2(double value) {
// NumberFormat에서 퍼센트 인스턴스를 가져온다
NumberFormat percentFormat = NumberFormat.getPercentInstance();
// 소수점 아래 자릿수 설정
percentFormat.setMinimumFractionDigits(0); // 최소 자리수
percentFormat.setMaximumFractionDigits(0); // 최대 자리수
String formatted = percentFormat.format(value);
System.out.println("type2->" + formatted);
}
간단하게 소수값에 100을 곱했던 이전 방식보다 복잡해 보이는 느낌이 있습니다.
하지만 사용해보면 얼마나 강력한지 알 수 있을 것입니다.
테스트
메소드로 만든 2개의 방식의 차이점을 비교해보도록 하겠습니다.
public static void main(String[] args) {
double a = 0.23;
double b = 0.045;
double c = 0.00713;
type1(a);
type2(a);
type1(b);
type2(b);
type1(c);
type2(c);
}
테스트 1 결과
type1->23%
type2->23%
type1->4%
type2->4%
type1->0%
type2->1%
테스트 1의 경우 대개 유사하지만, 마지막 0.00713이라는 값의 경우 type1은 0이라는 값이 나왔고, type2는 1%라는 값이 나온 것을 알 수 있는데요. 즉, NumberFormat 방식은 반올림이 알아서 적용된다는 것을 알 수 있습니다.
그리고 퍼센트에서도 나머지 소수점을 표현할 수 있는데요. 예를 들어, 0.2345 라는 값이 있을 경우 23.45%와 같이 두자리수까지 표현하는 케이스는 첫번째 방식으로 구현하는 방식이 복잡해집니다. 하지만 NumberFormat은 설정값만 변경하면 끝입니다.
percentFormat.setMaximumFractionDigits(2);
위와 같이 최대 자리수를 지정하면 되는데요. 위와 같이 최대자리수를 2로 지정할 경우 어떻게 결과가 나오는지 다시 한번 호출해보겠습니다.
테스트 2 결과
type1->23%
type2->23%
type1->4%
type2->4.5%
type1->0%
type2->0.71%
최대 소수점 자리수를 2로 지정한 결과 위와 같이 4% -> 4.5%, 1% -> 0.71%로 전혀 다르게 나온 것을 확인할 수 있습니다. 즉, 확률, 비율 등으로 퍼센트를 사용해야 할 경우에는 복잡하게 고전 방식으로 구현하지 말고, NumberFormat을 사용하는 것을 권유드립니다.
'Stackoverflow > Java' 카테고리의 다른 글
[Spring Boot] Could not find com.mysql:mysql-connector-j 에러 해결 원인 (0) | 2024.05.03 |
---|---|
[Spring Boot] RestController 인식이 안되는 경우 (1) | 2024.02.06 |
[Spring boot] JPA에서 대문자 테이블 인식 실패 문제 (0) | 2023.07.05 |
[Springboot] java.lang.UnsupportedClassVersionError (0) | 2023.01.03 |
EmptyResultDataAccessException: Incorrect result size: expected 1, actual 0 (0) | 2022.04.29 |