今天原本仍是在聽for循環,在語法上和php仍是很是像的,開始心不在焉了,看譚大爺的教材上有一個小算法題,就寫一下。題目是這樣的 : 1 + 1/2 + 1/3 + ... + 1/100 = ? 好歹也寫了兩三年的php了,這個還不是小菜一碟。而後就寫了以下代碼:
php
# include <stdio.h> int main(void) { int i; int sum = 0; for(i = 1; i <= 100; ++i) { sum += 1/i; } printf("sum = %d \n", sum); return 0; } /* 輸出結果爲: ========================== sum = 1 ========================== 怎麼會這樣呢?(我是文雅的人,就不說臥槽) */
哦,原來是數據類型錯了,相比之下,php卻是很省事。就把上面的sum的數據類型換成了float,%d也換成了%f,按照浮點型輸出。以下:算法
# include <stdio.h> int main(void) { int i; float sum = 0; //將sum改成浮點型 for(i = 1; i <= 100; ++i) { sum += 1/i; } printf("sum = %f \n", sum); //將輸出改成%f,按照浮點型輸出 return 0; } /* 輸出結果 =================================== sum = 1.000000 =================================== 怎麼會這樣呢?不是應該正常輸出麼?這不科學呀! */
在前幾天寫運算符筆記的時候,說到除法時有一個要點:
spa
除法/的運算結果和運算對象的數據類型有關,兩個數都是int,則商就是int,若商有小數,則截取小數部分;被除數和除數中只要有一個或兩個是浮點型數據,則商也是浮點型,不截取小數部分。(這個很重要).net
原來是醬紫,找到緣由了。而後就把第10行給稍微修改了一下,改爲: code
sum += 1.0 / i; //這樣就完美了。輸出 sum = 5.187378
兩個int類型相除,結果只會保留小數點前面的整數,都是0,固然結果也就一直是1了。
對象
今天的課也正好講到了這些內容。blog
強制類型轉換ci
格式:get
(數據類型)(表達式) 表達式那裏可用括號也可不用括號,爲了和其餘語言方便記憶,所有括起來。博客
功能:
把表達式的值強制轉化成前面所執行的數據類型
例如:
(int)(4.2 + 2.2) 最終值是6
(float)(5) 最終值是 5.000000
浮點數存儲所帶來的問題
自增自減都定義成浮點型,這是不對的
float和double都不能保證能夠精確的存儲一個小數,舉例:
/* float 和 double 類型沒法準確的記錄一個小數 */ # include <stdio.h> int main(void) { float f = 99.9; printf("%f \n",f); return 0; } /* 運行的結果是 ===================================== 99.900002 ===================================== */
舉例:
有一個浮點型變量x,如何判斷x的值是不是零
錯誤的寫法
if( 0 == x )
yes
else
no
正確的寫法
if( |x-0.000001| <= 0.000001 )
是
else
不是
浮點數存儲的都是一個近似值,因此不能直接判斷它是否是零,最直接的方法就是判斷它和某一個很小的數字之間相差是否很是很是小,若是相差很是很是小,就說明能夠當零去看待了
爲何循環更新的變量不能定義成浮點型?
仍是剛纔說到的,由於浮點數是一個近似值,若是拿近似值進行比較,頗有可能由於近似值多出一點點或者少一點點,而產生判斷錯誤,好比:
for( i =1 ; i <= 10; i++) 當i第九次循環,因爲取到一個近似值10.000001,拿這個值和10去比較,第十次循環就泡湯了。因此:更新的變量必定不能使用浮點型。
學PHP的小螞蟻 博客 http://my.oschina.net/woshixiaomayi/blog