기본 원리(함수 사용 X)
내림(소수점 4번째 자리)
방법
- 1000 곱해서 소수점 3번째 자리까지 정수로 만들기
- int로 강제 형 변환해서 소수점 제거
- double형 1000으로 나누기(int보다 더 큰 자료형인 double로 자동 형 변환)
코드
double decimal = 0.12358;
double floored = (int) (decimal * 1000) / 1000.0;
- 연산 순서
- 괄호: (decimal * 1000)
- 단항 연산자: 형 변환 연산자 (int)
- 산술 변환: int와 double의 연산이므로 int가 double로 형 변환
- (int) (decimal * 1000) → int
- 1000.0 → double
- 이항 연산자: 사칙 연산자 (/)
- double형 끼리의 연산이므로 결과도 double
결과
반올림(소수점 4번째 자리)
방법
- 1000 곱해서 소수점 3번째 자리까지 정수로 만들기
- 0.5 더한 뒤 int로 강제 형 변환
- 0이상
0.5미만: 0.5 더하면 0.5이상1미만 → int로 강제 형 변환하면 소수점 사라짐
- 0.5이상
1미만: 0.5 더하면 1이상0.5미만 → int로 강제 형 변환하면 정수 1 더해진 채로 소수점 사라짐
- double형 1000으로 나누기
코드
double decimal = 0.12358;
double rounded = (int) (decimal * 1000 + 0.5) / 1000.0;
결과
- 0.12349 → 0.123
- 0.12350 → 0.124
올림(소수점 4번째 자리)
방법
- 1000 곱해서 소수점 3번째 자리까지 정수로 만들기
- 1번에 10 곱한 뒤 10으로 나눈 나머지를 구해서 소수점 4번째 자리 구하기
- 2번이 0보다 크면 1번에 1 더하기
- int로 강제 형 변환해서 소수점 제거
- double형 1000으로 나누기
코드
double decimal = 0.12301;
double scaled = decimal * 1000;
int firstDecimalPlace = (int) (scaled * 10 % 10);
int scaledInteger = (int) scaled;
double ceiled = (firstDecimalPlace > 0 ? scaledInteger + 1 : scaledInteger) / 1000.0;
결과
- 0.12301 → 0.123
- 0.12311 → 0.124
소수점 n번째 자리에서 내림/반올림/올림
내림
코드
public double floor(double decimal, int n) {
double scale = Math.pow(10, n - 1);
return (int) (decimal * scale) / scale;
}
결과
- floor(0.12358, 5) = 0.1235
반올림
코드
public double round(double decimal, int n) {
double scale = Math.pow(10, n - 1);
return (int) (decimal * scale + 0.5) / scale;
}
결과
- round(0.12349, 4) = 0.123
- round(0.12350, 4) = 0.124
올림
코드
public double ceil(double decimal, int n) {
double scale = Math.pow(10, n - 1);
double scaled = decimal * scale;
int firstDecimalPlace = (int) (scaled * 10 % 10);
int scaledInteger = (int) scaled;
return (firstDecimalPlace > 0 ? scaledInteger + 1 : scaledInteger) / scale;
}
결과
- ceil(0.12301, 4) = 0.123
- ceil(0.12311, 4) = 0.124