Language/Java

소수점 자르기

snowkit 2022. 6. 14. 00:14

기본 원리(함수 사용 X)

내림(소수점 4번째 자리)

방법

  1. 1000 곱해서 소수점 3번째 자리까지 정수로 만들기
  2. int로 강제 형 변환해서 소수점 제거
  3. double형 1000으로 나누기(int보다 더 큰 자료형인 double로 자동 형 변환)

코드

double decimal = 0.12358;
double floored = (int) (decimal * 1000) / 1000.0;
  • 연산 순서
    1. 괄호: (decimal * 1000)
    2. 단항 연산자: 형 변환 연산자 (int)
    3. 산술 변환: int와 double의 연산이므로 int가 double로 형 변환
      • (int) (decimal * 1000) → int
      • 1000.0 → double
    4. 이항 연산자: 사칙 연산자 (/)
      • double형 끼리의 연산이므로 결과도 double

결과

  • 0.12358 → 0.123

반올림(소수점 4번째 자리)

방법

  1. 1000 곱해서 소수점 3번째 자리까지 정수로 만들기
  2. 0.5 더한 뒤 int로 강제 형 변환
    • 0이상0.5미만: 0.5 더하면 0.5이상1미만 → int로 강제 형 변환하면 소수점 사라짐
    • 0.5이상1미만: 0.5 더하면 1이상0.5미만 → int로 강제 형 변환하면 정수 1 더해진 채로 소수점 사라짐
  3. double형 1000으로 나누기

코드

double decimal = 0.12358;
double rounded = (int) (decimal * 1000 + 0.5) / 1000.0;

결과

  • 0.12349 → 0.123
  • 0.12350 → 0.124

올림(소수점 4번째 자리)

방법

  1. 1000 곱해서 소수점 3번째 자리까지 정수로 만들기
  2. 1번에 10 곱한 뒤 10으로 나눈 나머지를 구해서 소수점 4번째 자리 구하기
  3. 2번이 0보다 크면 1번에 1 더하기
  4. int로 강제 형 변환해서 소수점 제거
  5. 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

'Language > Java' 카테고리의 다른 글

오버라이딩(Overriding), 오버로딩(Overloading)  (0) 2022.07.17
초기화 블록(Initialization block)  (0) 2022.07.17
배열(Array)  (0) 2022.07.17
문자형(char)  (0) 2022.06.13
형 변환(Type Casting)  (0) 2022.06.12