關於C 資料型別使用的注意點

2021-09-01 08:41:53 字數 1281 閱讀 7794

最近被人問到一道題:

輸入兩個整數n6,輸出1/n2+1/(n+1)2+…+1/m2,保留5位小數。

一開始是這樣寫的

int i;

double sum=0;

for(i=n;i<=m;i++

) sum+=1

/(double

)(i*i)

;printf

("%.5f"

,sum)

;

結果錯了。

為什麼呢,因為n,m最大是106,平方之後是1012,而32位int型別最多存放10位十進位制數,導致了資料丟失。

兩種改進方法:

long

long i;

double sum=0;

for(i=n;i<=m;i++

) sum+=1

/(double

)(i*i)

;printf

("%.5f"

,sum)

;

①將 i 宣告為long long型別 ( long和32位int是一樣的,long同樣不夠 ),這樣 i * i 的值就存得下了。

int i;

double sum=0;

for(i=n;i<=m;i++

) sum+=1

/((double

)i*(

double

)i);

printf

("%.5f"

,sum)

;

②將兩個 i 分別強制型別轉換成double型別,再相乘。

再者,關於資料型別的轉化補充一些。

①自動型別轉換,發生在以下4種情況:

1、算術表示式中,低型別能夠轉換為高型別。

2、賦值表示式中,右邊表示式的值自動隱式轉換為左邊變數的型別,並賦值給他。

3、函式呼叫中引數傳遞時,系統隱式地將實參轉換為形參的型別後,賦給形參。

4、函式有返回值時,系統將隱式地將返回表示式型別轉換為返回值型別,賦值給呼叫函式。

ps.字元型會轉換為整型。

②強制型別轉換:

(型別說明符) (表示式)

資料型別轉換時,一般低型別轉換為高型別,不會丟失資料,而高型別向低型別轉換,會發生資料丟失。(主要與資料的儲存位數有關)(而浮點型轉換為整型會去除小數)

因此,這裡int、long long轉double就不會丟失資料。

參考資料:

ECMAScript的資料型別注意點

ecmacript包含6中資料型別 五種基本資料型別 number string boolean undefined null 一種複雜資料型別 object 1 特殊知識點 1 typeof null null 原因 null是乙個空的物件引用 2 safari5及之前的版本,chrome7及之前...

JavaScript資料型別的幾個注意點

ecmascript有5種簡單的資料型別 undefined null boolean number和string,還有1種複雜資料型別 object。通過typeof可以檢測給定變數的資料型別,如 var message some string alert typeof message 執行結果如...

基本資料型別轉換的注意點

注意 操作比較大的數時,要留意是否溢位 結果比表示範圍大 尤其是對整數進行操作時 int money 1000000000 10億 10億在int的表示範圍內 int years 20 返回的total是負數,因為超過了int的範圍溢位了 int total money years 結果是int,因...