Re: [問題] 預設的 double -> int 隱式轉換或強制轉換

看板C_and_CPP (C/C++)作者 (Alien)時間16年前 (2009/04/28 10:59), 編輯推噓2(202)
留言4則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《lytn (sapphira)》之銘言: : 經過我自己測試的結果, : 在Dev-C++ 或是VC++裡測試 : double a=4.9; : int b=a; //or int b=(int)a; : cout b; << b會等於 : 好像就是直接捨位了.想知道這是C++的標準預設嗎? : 在C裡面 math.h 還有提供 ceil() ,floor()來做進位跟捨位 : 但是我書上寫的這兩個函式的傳回值都是double, : 如果真的要整數的話,勢必還要轉型,所以才會在意到底是轉成怎麼樣的. : 或是有沒有可靠的預設函式可以直接拿到整數的? : 另外我是自己做一個ceil函式啦,也想知道這樣搞跟#include<cmath> 之類的哪個比較快, : 因為我真的沒有用很多cmath,math.h 裡的東西. double 轉 整數, 就單純的 truncate. 這是標準, 不用擔心. : int IntUp(double adouble){ //無條件進位 : int tempint; : tempint=adouble; : if(tempint<adouble){return (tempint+1);} : else{return tempint;} : }; : int Int_4_5(double adouble){ //四捨五入 : if(adouble>0){ : int temp=IntUp(adouble); : if((temp-adouble)<0.5){ : return temp; : } : else{ : return temp-1; : } : } : } 四捨五入比較單純一點, 只要 int rounding(double val) { // 要留心 int 的 range 比 double 少 return (int) (val + 0.5); } 就夠了 無條件進位比較複雜一點. (其實四捨五入視乎情況也 應該考慮一樣的問題, 不過沒那麼明顯而已) 因為 浮點數 (double/float) 只是大約數. 剛好 12 的無條件進位, 一般人會覺得應該仍然要維持 12, 可是 12 在 memory 中可能是 12.000000000000001, 單從數值上看, 是 12點幾, 又該需要進位. 這種情況你要定義你程式的最小計算單位, 再以此 adjust 你的數值. 比如你知道你的程式最多只會去到小數後4 位, 你可以: const double EPSILON = 0.00001; int ceil(double val) { return (int) (val - EPSILON + 1.0); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 202.155.236.82 ※ 編輯: adrianshum 來自: 202.155.236.82 (04/28 12:09)

04/28 12:37, , 1F
+0.5取int之前不是有討論遇到負數可能會有問題@_@"
04/28 12:37, 1F

04/28 12:47, , 2F
複數詳細希望
04/28 12:47, 2F

04/28 12:51, , 3F
複數我也不會XD 不過, -4.9+0.5取int似乎是-4不是-5 :)
04/28 12:51, 3F

04/28 16:02, , 4F
嗯, 那加回 if val < 0 就 減 0.5 吧? :P
04/28 16:02, 4F
文章代碼(AID): #19zd4UK2 (C_and_CPP)
文章代碼(AID): #19zd4UK2 (C_and_CPP)