1. 소수
우리 프로젝트를 다시 떠올려보자 — 예를 들어, 이건 아주 간단한 계산기라고 치자. 아니면 계산이 필요한 아무 프로그램(돈 계산부터 복잡한 물리까지). 현실 세계에서 모든 게 정수는 아니잖아, 어쩔 수 없어!
그러니까 이제 새로운 데이터 타입을 써보자!
프로그래밍에서 소수는 실수 또는 부동 소수점 숫자(floating-point)라고도 불러. C#에서도 그렇고, 대부분의 언어에서 이 타입은 정수뿐만 아니라 "소수" 값도 저장할 수 있어: 3.14, -28.57, 2.718281828 같은 거 말이지...
실수(소수)는 두 가지 주요 타입이 있어:
| 타입 | 저장하는 값 | 값의 범위 (대략) | 정밀도 | 일반적인 크기 |
|---|---|---|---|---|
|
숫자 | ±1.5 × 10-45 ... ±3.4 × 1038 | 소수점 이하 약 7자리 | 4 바이트 |
|
숫자 | ±5.0 × 10-324 ... ±1.7 × 10308 | 소수점 이하 약 15-16자리 | 8 바이트 |
float 타입
float 타입은 floating-point number에서 이름이 왔어 — 부동 소수점 숫자라는 뜻이지. 수학에서 실수는 여러 성질이 있지만, 컴퓨터는 제한이 많아. 그래서 C#에서 소수를 실수라고 부르는 건 완전히 정확하진 않아. 그냥 "부동 소수점 숫자"라고 하는 게 맞아.
float 타입은 보통 7자리 정도의 유효 숫자(예: 0.1234567), 10의 지수, 그리고 4 바이트 메모리를 써. 이건 정확한 계산에는 너무 부족해서, 다들 금방 double(두 배 정밀도)로 넘어가.
2. double 타입 변수 선언과 초기화
int랑 똑같이 하면 돼 — 이제 double만 쓰면 돼.
// 변수 선언하고 파이 값 할당
double pi = 3.1415926;
// 초기화 없이 선언도 가능
double averageSalary;
averageSalary = 91234.56;
// 계산도 가능!
double pizzaPieces = 8;
double friends = 3;
double piecesPerFriend = pizzaPieces / friends; // 2.666... (2가 아님)
문법 특징:
- 소수점 구분자로 점(3.14)을 써야 해. 쉼표 쓰면 컴파일 에러 나!
- 사실 double d = 3; 이렇게 써도 에러 안 나 — 타입이 자동 변환돼(정수가 "실수"로 손실 없이 바뀜).
3. Console로 실수 입력과 출력
먼저 소수 출력부터 해보자:
double amount = 42.75;
Console.WriteLine(amount); // 출력: 42.75
좋아! 텍스트도 붙여보면:
Console.WriteLine("네 계좌에: " + amount + " 유로."); // 네 계좌에: 42.75 유로.
키보드 입력
중요한 점: Console.ReadLine()은 항상 문자열을 반환하니까, double로 변환해줘야 해.
Console.WriteLine("밖 온도를 입력하세요:");
string input = Console.ReadLine();
double temperature = double.Parse(input); // 문자열을 double로 변환
Console.WriteLine("지금 밖은: " + temperature + " 도야.");
4. double 타입 실전: 연산
익숙한 연산자(+, -, *, /)는 int랑 똑같이 써:
double distance = 100.5;
double time = 2.0;
double speed = distance / time; // 50.25
Console.WriteLine("평균 속도: " + speed); // 평균 속도: 50.25
연산은 이게 다야. 딱 한 가지 차이점: 피연산자 중 하나라도 double이면, 결과는 항상 소수야.
int와 비교
int a = 5, b = 2;
Console.WriteLine(a / b); // 2 (나머지는 버림)
double aa = 5, bb = 2;
Console.WriteLine(aa / bb); // 2.5
5. double 쓸 때 흔한 실수와 이상한 점
문자열 변환 에러
이건 진짜 자주 나오는 상황: 사용자가 3,14를 입력하는데, 프로그램은 3.14를 기대하고 있어.
// "3,14" 입력하면 에러남
double value = double.Parse(Console.ReadLine());
만약 쉼표가 소수점 구분자인 나라(예: 폴란드, 독일)에서 프로그램을 돌리면 double.Parse가 잘 동작해. 근데 "영어" 설정으로 실행하면 점을 써야 해.
컴퓨터에서 숫자 "부정확함" 에러
여기서 초보자들이 보통 당황하지:
double x = 0.1 + 0.2;
Console.WriteLine(x); // 음... 0.30000000000000004
축하해, 이제 컴퓨터 내부에서 소수가 어떻게 저장되는지의 "마법"을 만난 거야. 어떤 숫자는 2진수로 정확히 표현이 안 돼서 그래. 이건 다음 강의에서 더 자세히 다룰 거고, 지금은 걱정하지 마! 대부분의 앱에서는 별 문제 없지만, 금융이나 과학 계산에서는 신경 써야 해.
6. 중요: double과 int — 자동 변환과 명시적 변환
정수랑 소수를 더하거나, int를 double 변수에 넣어도 에러 안 나:
int i = 2;
double d = i; // 문제 없음!
Console.WriteLine(d); // 2
double dd = 3.7;
int ii = (int) dd; // double을 int로 명시적으로 변환해야 해!
Console.WriteLine(ii); // 3, 소수점 이하는 버림
이게 의외로 헷갈릴 수 있어 — 왜 변환하면 소수점 이하가 사라지지? int 타입은 소수를 저장 못 하니까(점 뒤는 영원히 사라짐).
double을 int로 변환하는 법과 (int) 연산자는 다음 강의에서 더 자세히 다룰게.
7. 포맷팅해서 double 예쁘게 출력하기
보통 double을 그냥 출력하면 쓸데없는 0이 많이 붙어. 출력 포맷을 지정할 수 있어:
double temp = 23.56789;
Console.WriteLine(temp); // 23.56789
Console.WriteLine(temp.ToString("F2")); // 23.57 (소수점 이하 2자리)
Console.WriteLine($"{temp:F1}"); // 23.6 (문자열 보간)
| 포맷 | 결과 | 설명 |
|---|---|---|
| "F0" | 24 | 소수점 없음 |
| "F2" | 23.57 | 소수점 이하 두 자리 |
| "F5" | 23.56789 | 소수점 이하 다섯 자리 |
GO TO FULL VERSION