1. 小數
來回憶一下我們的專案——假設這是一個超簡單的計算機。或者任何需要計算的程式(從簡單的金錢計算到複雜的物理運算都算)。現實生活中很多東西都不是整數,這沒辦法啊!
所以我們來裝備一個新的資料型別吧!
在程式裡,小數還會被叫做實數,或是浮點數(floating-point)。在 C#,跟大多數語言一樣,它們是用來存不只是整數,還有「小數」的值:像是 3.14、-28.57、2.718281828 這種...
實數主要有兩種型別:
| 型別 | 存什麼 | 值的範圍(大概) | 精度 | 典型大小 |
|---|---|---|---|---|
|
數字 | ±1.5 × 10-45 ... ±3.4 × 1038 | ~7 位小數 | 4 byte |
|
數字 | ±5.0 × 10-324 ... ±1.7 × 10308 | ~15-16 位小數 | 8 byte |
float 型別
float 這個名字是從 floating-point number 來的——就是浮點數啦。實數是數學裡的數字,有一些特性。但電腦有很多限制。所以其實在 C# 裡叫小數「實數」不太精確,通常會叫「浮點數」。
float 通常可以存 7 位有效數字(像 0.1234567),還有十的次方,佔 4 byte 記憶體。這對精確計算來說太少了,所以大家很快就改用雙精度的數字了。
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
很 OK!如果加點文字呢:
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
恭喜你,這就是電腦裡小數表示的「魔法」啦。因為有些數字在二進位裡根本沒辦法精確表示。這個我們下堂課會細講,現在先別慌!大部分應用都沒差,但如果是金融或精密科學就要注意。
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 預設會帶一堆多餘的零。可以這樣格式化:
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