2007-12-16

整數型態的除法

對新手來說很重要的觀念!
請思考的程式碼印出結果,究竟會印出0.5或是0?

#include <stdio.h>
int main() {
  int a = 10 ;
  int b = 20 ;
  printf("%f\n", a/b) ;
  system("pause") ;
  return 0 ;
}
很多新手應該會選擇0.5吧!確實~以人類思考角度來看0.5應該是正確的,可是在C語言看來0才是正確解答。
在C語言中,除法分為整數除法浮點數除法
  • 整數除法
    電腦僅會算到整數值,至於小數(分數)部分直接省去,並且是無條件捨位。
  • 浮點數除法
    電腦會一路除下去,直到表示位數的最小位數,採用四捨五入。

那究竟什麼時候採用整數除法又什麼時候採用浮點數除法呢?當然不是看電腦心情隨機決定XD
端看除法兩邊的運算元來決定,如果除法的兩個運算子其中一個為浮點數型態(float或double)則電腦就會採用浮點數除法,否則就採用整數除法。上面的例子會採用整數除法,原因是變數a與b都是整數型態,因此採用整數除法。
接著再看以下範例,答案將會是0.666667
#include <stdio.h>
int main() {
  float a = 2 ;
  float b = 3 ;
  printf("%f\n", a/b) ;
  system("pause") ;
  return 0 ;
}

3 則留言:

匿名 提到...

float 在宣告有給值,最好能在值後面加上f以代表為float
  float a = 2f ;
  float b = 3f ;

如果沒加的話,我沒記錯的話有的compiler會出現error或者認定該值為double type

Ronald 提到...

你的觀念是正確的
由於小數型別存在著浮點數倍精浮點數兩種型態,因此如果是使用浮點數型別則應該於數值後端加入'f'或'F'修飾字元以告訴編譯器確切的資料型別,否則編譯器將認定該常數型別是倍精浮點數。
以此例來說,由於是將常數指定給浮點數型別的變數a,現在的編譯器都會自動轉換型別為對應的型態,因此不會有編譯錯誤訊息。
==================================
對應觀念
如果希望長數被視為是long double型態,則應於常數最後加入'l'或'L'修飾字元。

謝謝指導  :)

匿名 提到...

C語言沒記錯的話是五捨六入吧