C語言中四捨五入問題的總結
在C語言中大部分情況下都是不需要四捨五入的。
除了一種情況:在使用輸出函式 printf()限制浮點型輸出的小數位個數
eg:
printf("%0.2f",1.567);//輸出的結果是1.57
其他情況下都不需要四捨五入,比如
- 強制轉換
在不同型別的混合運算中,編譯器也會自動地轉換資料型別,將參與運算的所有資料先轉換為同一種型別,然後再進行計算。
轉換的規則:轉換按資料長度增加的方向進行,以保證數值不失真,或者精度不降低。
eg:
- int 和 long 參與運算時,先把 int 型別的資料轉成 long 型別後再進行運算。
- 所有的浮點運算都是以雙精度進行的,即使運算中只有 float 型別,也要先轉換為 double 型別,才能進行運算。
- char 和 short 參與運算時,必須先轉換成 int 型別。
- 自動轉換
自動型別轉換是編譯器默默地、隱式地進行的一種型別轉換,不需要在程式碼中體現出來;強制型別轉換是程式設計師明確提出的、需要透過特定格式的程式碼來指明的一種型別轉換。換句話說,自動型別轉換不需要程式設計師干預,強制型別轉換必須有程式設計師干預。
強制轉換格式: (需要轉換的資料型別) 變數
總結:無論是自動型別轉換還是強制型別轉換,都只是為了本次運算而進行的*臨時性轉換*,轉換的結果也會儲存到臨時的記憶體空間(棧空間),不會改變資料本來的型別或者值。
debug程式如下:
#include<stdio.h>
int main(int argc, char const *argv[])
{
int a=((double)(3/2)+0.5+(int)1.987);
//(double)(3/2)先計算3/2,再強轉,(int)1.987=1
int b=1.9+2.3;
//先計算 1.9+2.3(其中自動轉化成double型別),因為b是int型別,所以b=4
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("(int)1.6: %d\n",(int)1.6);
printf("1.6: %#x\n",1.6);
printf("3.0+2: %f\n",3.0+2);
printf("3.0+2: %d\n",3.0+2);
return 0;
}
執行結果 :
PS E:\桌面資料\jing117> cd "e:\桌面資料\jing117" ; if ($?) { gcc debug.c -o debug } ; if ($?) { .\debug }
a=2
b=4
(int)1.6: 1
1.6: 0x9999999a
3.0+2: 5.000000
3.0+2: 0
需要注意的是,
- 在執行程式碼
printf("1.6: %#x\n",1.6);
時,得到的結果並不是1 ,而是0x9999999a,說明這個格式不能正確引用輸出。
- 在執行程式碼
printf("3.0+2: %d\n",3.0+2);
時,得到的結果並不是5 ,而是0。這是為什麼呢?