小白求解 c語言型別轉換int轉double後除法輸出有問題 加減乘都沒有

時間 2021-05-11 18:41:26

1樓:Fujie Chen

你一開始的(double)(a/b)實際上做的是整型a除以整型b得到乙個整型結果然後強制轉換到double,運算過程中因為都是整型變數,所以直接捨棄小數字。

第二次的((double)a/b)做的呢是先把a強制轉換成double,再去除以b。實際上是浮點型變數除以整型變數,做運算的時候結果會轉換成最複雜的型別。所以運算時實際是把b也強制轉換成了double。

double處於double,於是就得到了精確的帶小數字的浮點數結果。

至於加減乘不會有問題,是因為整數與整數之間的加減乘運算不會得到帶小數字的結果。

舉個例子,a=3,b=2。加減乘運算結果分別為5,1和6。結果都能用整型int表達。

而如果是除法,我們期望的結果應該是1.5。但用你第乙個運算方式(double)(a/b),結果是3/2=1,然後強制轉換double,結果為1.

00。而第二個運算方式((double)a/b),結果是3.00/2=1.

50,於是得到了正確答案。

2樓:Yuan

應邀。區別在於:你要的是「整除後的浮點表示」還是「浮點數除法」

原題中提到的加、減、乘法在上述的語境下,結果的形式是沒有不同的,而除法則不然。

為方便表示,我們令

A:運算後的浮點表示

B:浮點運算

假設 a=1, b=3

加法運算中

A:double (a+b) 即 double(1+3)即 double(4)即 4.0

B:double (a) + b 即 double (1) + 3 即 1.0 + 3 即 4.0

減法運算中

A:double (a-b) 即 double(1-3)即 double(-2)即 -2.0

B:double (a) - b 即 double (1) - 3 即 1.0 - 3 即 -2.0

乘法運算中

A:double (a*b) 即 double(1*3)即 double(3)即 3.0

B:double (a) * b 即 double (1) * 3 即 1.0 * 3 即 3.0

除法運算中

A:double (a/b) 即 double(1/3)即 double(0)即 0.0

B:double (a) / b 即 double (1) / 3 即 1.0 / 3 即 0.333333333

3樓:

這個括號的位置不對,應該時先將a轉換為double再與b運算,這樣的結果就是你期望的值了,而像題目中的就是先對a/b進行運算,這個是整數間的運算,所以結果不是題主想的。

4樓:

涉及到乙個運算先後順序的問題,

double(a/b)很明顯a/b是先算的,之後轉為double,譬如說吧double(3/2)是這樣計算的,先求3/2,得到1,之後轉為double,最終是1.00000

5樓:

因為整數除法會將結果的小數部分抹去,之後再轉成double已經無濟於事,在除之前先轉為double才能得到正確的結果。

加減乘不會出錯的原因很簡單,整數做加減乘不會出現小數啊。

C語言裡int型別到底為多長?

gesturewei C語言定義的int就是不比short短,不比long長,目前常見平台上實現的都是32位。整數長度不明確這個算是C語言遺留問題,所以考慮用C99新加的stdint.h就好了,這個標頭檔案裡面定義了可移植整數型別,即int32 t int64 t等等。現在大部分編譯器都支援C99標...

C語言不同資料型別計算時轉換問題?

薛非 1.m a b 的計算過程中,是將a和b分別轉換為int型,還是將a b的結果轉換為int型?作為右值,所有短於int型別的資料都會被隱式地轉換為int或unsigned 所以m a b 本質上表達的是 m int a int b 這叫整數提公升 integer promotions 2.a ...

C語言中強制型別轉換是如何實現的?

涇渭漳淮 強制轉換時怎麼實現的?通常是由單獨的CPU指令實現的,也就是硬體實現的。5立方之後是125,125開立方之後是幾?嚴格的數學上應該是5,但實際上計算機有精度的限制,計算結果會有誤差,計算機計算得到的結果可能是4.9999999999999435452340065849之類的,將這個值直接取...