iT邦幫忙

0

【C#學習筆記】04《整數與浮點數》

  • 分享至 

  • xImage
  •  

整數(integer)浮點數(float)是程式設計中最基本也最常用的資料型別,整數主要用於不包含小數點的數字,例如年齡、分數、生命值或物件數量;而浮點數則用於需要小數精度的情境,例如座標、速度、時間或物理運算。
由於數值運算幾乎存在於所有程式邏輯中,因此理解整數與浮點數的差異,以及它們在運算時的特性,是學習程式設計的重要基礎之一。

以下範例命名僅為快速紀錄,實際開發時命名記得要是有意義的名稱!


【C#學習筆記】03《函式》


整數(Integer)

//----- 整數型別 integer types -----

sbyte a = 1;//-128 to 127
byte b = 2;//0 to 255

short c = 3;//-32,768 to 32,767
ushort d = 4;//0 to 65,535

int f = 5;//-2,147,483,648 to 2,147,483,647
uint g = 6;//0 to 4,294,967,295

long h = 7;//-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ulong i = 8;//0 to 18,446,744,073,709,551,615

f = a;
//a = f; // error: cannot convert int to sbyte

f = 1 / 2;// integer division, result is 0
f = 1 / 2 * 3 / 4;// integer division, result is 0

double j = 2 * 3 / 4;// integer division, result is 1
double k = 2 * 3 / 4.0;// mixed division, result is 1.5

浮點數(float)

//----- 浮點數型別 float types -----
//double 雙精度浮點數,精確度約15-16位小數
double aa = 0.1;
double bb = 0.2;
double cc = 3d;//d is double literal suffix
var sum = aa + bb;//sum is type of double
Console.WriteLine($"sum = {sum}");//value is 0.30000000000000004
Console.WriteLine($"sum = {sum:N2}");//value is 0.30

//float 單精度浮點數,精確度約7位小數
float ccc = 8f;//f is float literal suffix

//decimal 高精度十進位數,精確度約28-29位小數(用到機會很少)
decimal dddd = 9m;//m is decimal literal suffix

浮點數誤差

浮點數(Float)雖然可以表示小數,但因為電腦內部是使用二進位(Binary)儲存數值,所以某些十進位小數其實無法被精確表示,進而產生所謂的「浮點數誤差(Floating-point Error)」。
例如以下,sum的值是0.3,但實際跑出來的值卻是0.30000000000000004,在後續有大量計算的時候,誤差會持續累積,導致數值的錯誤。

double a = 0.1;
double b = 0.2;
double sum = a + b;

//a = 0.1, b = 0.2, sum = 0.30000000000000004
Console.WriteLine($"a = {a}, b = {b}, sum = {sum}");
Console.WriteLine($"a = {a}, b = {b}, sum = {sum:N3}");//not real 0.3

我們用條件式去檢查,就可以知道sum確實≠0.3

double a = 0.1;
double b = 0.2;
double sum = a + b;

Console.WriteLine($"a = {a}, b = {b}, sum = {sum}");
Console.WriteLine();

//print no
if ( sum == 0.3 ) Console.WriteLine("yes");
else Console.WriteLine("no");

因此,我們可以呼叫一些數學式去修正這個問題。

double a = 0.1;
double b = 0.2;
double sum = a + b;

Console.WriteLine($"a = {a}, b = {b}, sum = {sum}");
Console.WriteLine($"a = {a}, b = {b}, sum = {sum:N3}");//not real 0.3
Console.WriteLine();

//Math.Abs取絕對值
sum = Math.Abs(sum - 0.3) < 0.0001 ? 0.3 : sum;//sum-0.3的絕對值是否趨近於0.0001,是回傳0.3
Console.WriteLine($"sum = {sum}");//0.3

//print yes
if ( sum == 0.3 ) Console.WriteLine("yes");
else Console.WriteLine("no");

總結來說,整數(Integer)浮點數(Float)是程式設計中都會大量使用到的型別。整數適合處理沒有小數的數值,而浮點數則能表示更精細的小數運算,但也因此會產生精度誤差問題。

在實際開發中,除了需要理解不同數值型別的範圍與用途外,也必須特別注意「浮點數誤差(Floating-point Error)」帶來的影響。尤其在物理運算、時間計算、座標移動或大量累積計算時,微小誤差都可能逐漸放大,進而影響最終結果。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言