共用方式為


如何在 C# 中使用整數和浮點數

此教學課程會教導您有關 C# 中的數字型別。 您將會撰寫少量程式碼,然後編譯並執行該程式碼。 教學課程包含一系列探索 C# 中數字和數學運算的課程。 這些課程會教導您 C# 語言的基本概念。

提示

若要在焦點模式中貼上程式碼片段,您應該使用鍵盤快速鍵 (Ctrl + vcmd + v)。

必要條件

此教學課程預期您已設定機器以進行本機開發。 如需安裝指示和 .NET 中應用程式開發的概觀,請參閱 設定本機環境

如果您不想設定本機環境,請參閱 本教學課程的互動式瀏覽器版本

探索整數運算

建立名為 numbers-quickstart 的目錄。 將其設為目前的目錄,然後執行下列命令:

dotnet new console -n NumbersInCSharp -o .

重要

.NET 6 的 C# 範本會使用 最上層語句。 如果您已經升級至 .NET 6,您的應用程式可能不符合本文中的程式碼。 如需詳細資訊,請參閱新 C# 範本產生最上等級陳述式一文

.NET 6 SDK 也會為使用下列 SDK 的專案新增一組隱含global using 指示詞:

  • Microsoft.NET.Sdk
  • Microsoft.NET.Sdk.Web
  • Microsoft.NET.Sdk.Worker

這些隱含 global using 指示詞包含該專案型別最常見的命名空間。

如需詳細資訊,請參閱隱含 using 指示詞的文章

在您偏好使用的編輯器中開啟 Program.cs,並以下列程式碼取代檔案的內容:

int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);

在命令視窗中輸入 dotnet run 來執行此程式碼。

您看到的是一種基本的整數數學運算。 int 型別代表整數、零、正整數或負整數。 您使用 + 符號來執行加法。 整數常用的其他數學運算包括:

  • - 用於減法
  • * 用於乘法
  • / 用於除法

讓我們開始探索這些不同的運算。 將下列程式碼行新增至撰寫 c 值的程式碼行後方:

// subtraction
c = a - b;
Console.WriteLine(c);

// multiplication
c = a * b;
Console.WriteLine(c);

// division
c = a / b;
Console.WriteLine(c);

在命令視窗中輸入 dotnet run 來執行此程式碼。

如果您想要的話,也可以試著在同一行中寫入多個數學運算。 嘗試使用 c = a + b - 12 * 17; 作為範例。 允許混合變數和常數數字。

提示

在您探索 C# (或任何程式設計語言) 時,可能會在撰寫程式碼時犯錯。 編譯器會找出那些錯誤並回報給您。 當輸出包含錯誤訊息時,請仔細查看範例程式碼及視窗中的程式碼,看看有哪些可以修正。 該練習將有助於您了解 C# 程式碼的結構。

您已完成第一個步驟。 在開始下一節之前,讓我們將目前的程式碼移到另一個個別的方法。 方法是一系列分組在一起並指定名稱的陳述式。 您可以寫入方法名稱後接著 () 以呼叫方法。 將您的程式碼組織成方法,可讓您更輕鬆地開始使用新範例。 完成時,您的程式碼看起來應該像這樣:

WorkWithIntegers();

void WorkWithIntegers()
{
    int a = 18;
    int b = 6;
    int c = a + b;
    Console.WriteLine(c);


    // subtraction
    c = a - b;
    Console.WriteLine(c);

    // multiplication
    c = a * b;
    Console.WriteLine(c);

    // division
    c = a / b;
    Console.WriteLine(c);
}

此行 WorkWithIntegers(); 會叫用方法。 下列程式碼會宣告方法並加以定義。

探索運算的順序

將針對 WorkingWithIntegers() 的呼叫註解化。 這會在您處理本節的內容時,使輸出變得較為整齊:

//WorkWithIntegers();

// 會在 C# 中起始一段註解。 註解是您想保留在原始程式碼中,但不想要作為程式碼執行的任何文字。 編譯器不會從註解產生任何可執行的程式碼。 因為 WorkWithIntegers() 是方法,所以您只需要將一行註解化。

針對不同數學運算的優先順序,C# 語言所定義的規則與您在數學所學的規則一致。 乘法和除法的優先順序高於加法和減法。 在呼叫 WorkWithIntegers() 後新增下列程式碼,並執行 dotnet run 來探索:

int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);

輸出示範了程式會先執行乘法,然後再執行加法。

您可以在想要優先執行的一個或多個運算前後加上括號,以強制執行不同的運算順序。 新增下列程式碼行並再次執行:

d = (a + b) * c;
Console.WriteLine(d);

結合許多不同的運算來深入探索。 新增類似下列幾行的內容。 再次嘗試執行 dotnet run

d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);

您可能已注意到整數某個有趣的行為。 整數的除法一律會產生整數結果,即使您認為結果應有小數或分數部分也一樣。

如果您還沒看過這種行為,請嘗試下列程式碼:

int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);

再次輸入 dotnet run 來查看結果。

在繼續後續內容之前,讓我們將您在本節中所撰寫的所有程式碼置於新的方法中。 將新方法命名為 OrderPrecedence。 您的程式碼應該類似下列所示:

// WorkWithIntegers();
OrderPrecedence();

void WorkWithIntegers()
{
    int a = 18;
    int b = 6;
    int c = a + b;
    Console.WriteLine(c);


    // subtraction
    c = a - b;
    Console.WriteLine(c);

    // multiplication
    c = a * b;
    Console.WriteLine(c);

    // division
    c = a / b;
    Console.WriteLine(c);
}

void OrderPrecedence()
{
    int a = 5;
    int b = 4;
    int c = 2;
    int d = a + b * c;
    Console.WriteLine(d);

    d = (a + b) * c;
    Console.WriteLine(d);

    d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
    Console.WriteLine(d);

    int e = 7;
    int f = 4;
    int g = 3;
    int h = (e + f) / g;
    Console.WriteLine(h);
}

探索整數的精確度與限制

上一個範例示範了整數除法運算會將結果截斷。 您可以使用模數運算子 (% 字元) 來取得餘數。 呼叫 OrderPrecedence() 方法後嘗試下列程式碼:

int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
int e = (a + b) % c;
Console.WriteLine($"quotient: {d}");
Console.WriteLine($"remainder: {e}");

C# 整數型別有一個地方與數學上的整數不同:int 型別有最小和最大限制。 為了查看那些限制,請新增此程式碼:

int max = int.MaxValue;
int min = int.MinValue;
Console.WriteLine($"The range of integers is {min} to {max}");

如果計算產生的值超出這些限制,就會發生反向溢位溢位的情況。 答案看起來會是從其中一個限制回繞至另一個限制。 為了查看範例,請新增下列兩行:

int what = max + 3;
Console.WriteLine($"An example of overflow: {what}");

請注意,答案非常接近最小 (負) 整數。 這與 min + 2 相同。 此加法運算已溢出整數允許的值。 此答案是非常大的負數,這是因為溢位會從最大整數值「回繞」至最小整數值。

int 型別不符合您的需求時,還有其他具有不同限制和精確度的數字型別可供使用。 讓我們接著探索那些其它型別。 在開始下一節之前,請將您在本節中所撰寫的程式碼置於個別的方法中。 將它命名為 TestLimits

使用 Double 型別

double 數字型別代表雙精確度浮點數。 您可能不熟悉這些字詞。 浮點數可用以代表非常大或非常小的非整數數字。 雙精確度是一個相對詞彙,描述用來儲存值的二進位數位數目。 雙精確度數位的二進位數為單精確度的兩倍。 在現代的電腦上,比較常使用雙精確度而非單精確度數字。 單精確度數位使用 float 關鍵字宣告。 讓我們開始探索吧。 新增下列程式碼並查看結果:

double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);

請注意答案包括商數的小數部分。 請嘗試略為複雜的雙精確度浮點數運算式:

double e = 19;
double f = 23;
double g = 8;
double h = (e + f) / g;
Console.WriteLine(h);

雙精確度浮點數值的範圍遠大於整數值。 在您目前已撰寫的程式碼下方嘗試下列程式碼:

double max = double.MaxValue;
double min = double.MinValue;
Console.WriteLine($"The range of double is {min} to {max}");

這些值會以科學記號標記法呈現。 E 左邊的數字是有效數字。 右邊的數字則為指數,亦即 10 的次方。 就像數學上的小數數字,C# 中的雙精確度浮點數會發生捨入誤差。 請嘗試此程式碼:

double third = 1.0 / 3.0;
Console.WriteLine(third);

您知道 0.3 重複有限次數與 1/3 不完全相同。

挑戰

請嘗試使用 double 類型進行大型數字、小型數字、乘法和除法的其他計算。 嘗試更複雜的計算。 在嘗試完成挑戰之後,請將您所撰寫的程式碼置於新的方法中。 將新方法命名為 WorkWithDoubles

使用十進位型別

您已經看過 C# 中的基本數字型別:整數和雙精確度浮點數。 還有一個需要了解的類型是 decimal 類型。 decimal 類型的範圍較小,但精確度較 double 來得高。 讓我們來看看:

decimal min = decimal.MinValue;
decimal max = decimal.MaxValue;
Console.WriteLine($"The range of the decimal type is {min} to {max}");

請注意該範圍小於 double 型別。 透過嘗試下列程式碼,您可以看到 decimal (小數) 型別有較高的精確度:

double a = 1.0;
double b = 3.0;
Console.WriteLine(a / b);

decimal c = 1.0M;
decimal d = 3.0M;
Console.WriteLine(c / d);

數字上的 M 尾碼乃是指示常數應使用 decimal 型別。 否則,編譯器會假設 double 類型。

注意

將字母 M 選擇為 doubledecimal 關鍵字之間最視覺上相異的字母。

請注意,使用 decimal (小數) 型別的運算在小數點右邊會有更多的數字。

挑戰

您已經了解不同的數字型別,接著請撰寫程式碼,以計算半徑 2.50 公分的圓形面積。 提醒您圓形面積是 PI 乘以半徑的平方。 提示:.NET 包含 PI 的常數:Math.PI,可用來作為該值。 Math.PI 就像 System.Math 命名空間中宣告的所有常數一樣,是一個 double 值。 基於這個理由,您應該針對這項挑戰使用 double,而不是 decimal 值。

您應該會取得介於 19 和 20 的答案。 您可以在 GitHub 上查看完成的範例程式碼 \(英文\) 來檢查您的答案。

如果您想要的話,可以嘗試其他公式。

您已完成<C# 中的數字>快速入門。 您可以在自己的開發環境中,繼續完成分支和迴圈快速入門中的內容。

您可以在下列文章中深入瞭解 C# 中的數字: