C語言中四捨五入問題總結

沉舟道人發表於2024-04-29

C語言中四捨五入問題的總結

在C語言中大部分情況下都是不需要四捨五入的。

除了一種情況:在使用輸出函式 printf()限制浮點型輸出的小數位個數

eg:

printf("%0.2f",1.567);//輸出的結果是1.57

其他情況下都不需要四捨五入,比如

  • 強制轉換

在不同型別的混合運算中,編譯器也會自動地轉換資料型別,將參與運算的所有資料先轉換為同一種型別,然後再進行計算。

轉換的規則:轉換按資料長度增加的方向進行,以保證數值不失真,或者精度不降低。

eg:

  1. int 和 long 參與運算時,先把 int 型別的資料轉成 long 型別後再進行運算。
  2. 所有的浮點運算都是以雙精度進行的,即使運算中只有 float 型別,也要先轉換為 double 型別,才能進行運算。
  3. 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


需要注意的是,

  1. 在執行程式碼
printf("1.6: %#x\n",1.6);

時,得到的結果並不是1 ,而是0x9999999a,說明這個格式不能正確引用輸出。

  1. 在執行程式碼
printf("3.0+2: %d\n",3.0+2);

時,得到的結果並不是5 ,而是0。這是為什麼呢?

相關文章