整數(integer)與浮點數(float)是程式設計中最基本也最常用的資料型別,整數主要用於不包含小數點的數字,例如年齡、分數、生命值或物件數量;而浮點數則用於需要小數精度的情境,例如座標、速度、時間或物理運算。
由於數值運算幾乎存在於所有程式邏輯中,因此理解整數與浮點數的差異,以及它們在運算時的特性,是學習程式設計的重要基礎之一。
以下範例命名僅為快速紀錄,實際開發時命名記得要是有意義的名稱!
//----- 整數型別 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 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)」帶來的影響。尤其在物理運算、時間計算、座標移動或大量累積計算時,微小誤差都可能逐漸放大,進而影響最終結果。