본문 바로가기

국비교육/국비교육 복습

Day02_data_Test14 : BMI 수치 계산 (형 변환 + 소수점 표기) (★)

(Q) BMI 계산기
BMI는 체질량지수(비만지수)를 말합니다.
구하는 공식은 'BMI = 체중(kg) / 키(m)^2' 입니다.
키가 180cm이고, 체중이 80kg인 사람의 BMI 지수를 구하여 출력

 

package day02;

import java.lang.*;

public class Day02_data_Test14 {

	public static void main(String[] args) {
    
    		int kgWeight = 80;
    		int cmHeight = 180;
    
    		double mHeight = (double)cmHeight / 100;
    		double mHeightSquare = mHeight * mHeight;
    
    		double bmi = kgWeight / mHeightSquare;
    
    		double bmiDecimal = bmi * 100 / 100;
    
    		System.out.println(bmiDecimal);
    
    }
	
}

 

변수

- kgWeight : 몸무게 [kg]

- cmHeight : 키 [cm]

- mHeight : 키 [m]

 

1) 단위 환산시 소수점 이하를 버리면 오차가 커진다

- mHeight를 구할 때 변수 타입을 정수형으로 선언하면 소수점 이하가 버림되어 데이터가 1.8이 아닌 1이 된다

- mHeight를 구할 때 변수 타입을 실수형으로 선언해야 소수점 이하를 고려하여 1.8을 저장할 수 있다

 

2) mHeight의 제곱을 나타내는 방법

- mHeightSquare라는 제곱을 나타내는 변수를 직접 선언하는 방법

double mHeightSquare = mHeight * mHeight;	//제곱을 나타내는 변수 선언
double bmi = kgWeight / mHeightSquare;

 

- kgWeight에서 mHeight를 직접 2번 나누는 방법 (컴퓨터 연산의 순셔는 좌에서 우로 진행한다)

double bmi = kgWeight / mHeight / mHeight;	//kgWeight를 직접 2번 나누는 방법

 

3) 소수점 이하 2자리까지만 표시하는 방법

- 10의 거듭제곱을 곱한 후(*) 나누는(/) 방법

double bmiDecimal = bmi * 100 / 100;

 

- 라이브러리를 이용하는 방법 (Scanner를 쓸 때 필요했던 import java.util.Scanner와는 달리 import 구절이 필요 없다?)

//DecimalFormat 라이브러리 형태
DecimalFormat 변수명 = new DecimalFormat("0.00");

 

//DecimalFormat 라이브러리를 이용하여 bmi 출력의 형태를 변경
DecimalFormat fm = new DecimalFormat("0.00");
System.out.println(fm.format(bmi));

 

 

** 소수점을 구하려고 시도해봤던 방법과 출력이 부정확했던 이유?

i) double bmi = kgWeight / (cmHeight * cmHeight / 10000);

- 'cmHeight * cmHeight'의 결과가 32400이며  '/ 10000'를 연산하는 과정에서 소수점 이하 버림이 발생하여 오차 발생

 

ii) double bmi = kgWeight / (cmHeight / 100) / (cmHeight / 100);

- 'cmHeight / 100'을 하는 과정에서 1.8이 아닌 1이 나오므로 오차 발생

- cmHeight 앞에 형 변환을 했어야 했다