C語言有以下幾種取整方法:

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設計制作、成都網(wǎng)站制作與策劃設計,方正網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設10多年,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:方正等地區(qū)。方正做網(wǎng)站價格咨詢:18980820575
1、直接賦值給整數(shù)變量。如:
int i = 2.5; 或 i = (int) 2.5;
這種方法采用的是舍去小數(shù)部分,能用于你的問題。
2、C/C++中的整數(shù)除法運算符“/”本身就有取整功能(int / int),而下面介紹的取整函數(shù)返回值是double。整數(shù)除法對正數(shù)的取整是舍去小數(shù)部分,能用于你的問題。不過整數(shù)除法對負數(shù)的取整結果和使用的C編譯器有關。
3、使用floor函數(shù)。floor(x)返回的是小于或等于x的最大整數(shù)。如:
floor(2.5) = 2
floor(-2.5) = -3
4、使用ceil函數(shù)。ceil(x)返回的是大于x的最小整數(shù)。如:
ceil(2.5) = 3
ceil(-2.5) = -2
floor()是向負無窮大舍入,floor(-2.5) = -3;ceil()是向正無窮大舍入,ceil(-2.5) = -2。floor函數(shù)能用于你的問題。
5、
int b = (int)a;//取整
int c = (int)(a+0.5);//四舍五入
在公司項目中看到關于錢的數(shù)據(jù)在接口展示、添加修改的各種情況下結構體中相應字段用的都是string類型。覺得不太合理,因此查閱了一些資料,整理如下。
在網(wǎng)上搜到一篇博客:
在程序計算中涉及到錢的時候,為什么要用Decimal而不是Float
博客中介紹,如果用float類型再轉為decimal類型時會造成精度丟失。轉為string后再轉為decimal則可以解決問題,保證精度。看著好像是很完美的回答了我想要了解的問題,但仔細一看用的語言是python,于是我便親自試了下:
結果確實如此,但看版本是2.7,我懷疑是不是python2.7版本落后,因此存在問題,于是又換了python3,再次測試:
結論依然是一樣。好吧,證實了,對于python確實應該先轉為string再轉為decimal。
但是,python是這樣,難道go也是這樣嗎,于是我又開始了進一步測試:
go中decimal使用第三方庫
這里是直接用float64轉為decimal,并沒有通過string中轉,結果輸出如下:
乍一看,看著好像是精度丟失了似的,但是對比后我們發(fā)現(xiàn),float64和decimal前后都是一致的,也就是說float64轉為decimal之后,保持了原樣。那些看起來小數(shù)點后位數(shù)很多的結果,是因為float64浮點類型計算產(chǎn)生的問題,跟轉換并沒有關系。
為了驗證這一結論,我又寫了下面的測試:
不使用浮點類型相加,而用decimal類型相加,這樣輸出結果果然沒問題了:
因此我們可以得出結論:對于go語言,在把float轉換為decimal類型時,并不需要像python一樣通過string中轉,也依然可以保持精度。進一步,我們也可以想到上面的問題,對于錢,在結構體字段中,我們完全可以直接使用float類型,并不需要用string類型。而且好處時,使用float數(shù)值類型,無論對于前端還是后端,在進行數(shù)值范圍驗證的時候,會更方便,不必把string轉為float后再驗證了。
上面提到了decimal包,我們這里簡單看下,里面的常用的方法:
定義decimal的幾種方式:
decimal數(shù)值運算
比較:
我們再看下浮點精度運算不準確的原因,這篇文章講解的比較細
浮點精度(float、double)運算不精確的原因
精度運算不準確這是為什么呢?我們接下來就需要從計算機所有數(shù)據(jù)的表現(xiàn)形式二進制說起了。如果大家很了解二進制與十進制的相互轉換,那么就能輕易的知道精度運算不準確的問題原因是什么了。
接下來我們看一個簡單的例子 2.1 這個十進制數(shù)轉成二進制是什么樣子的。
落入無限循環(huán)結果為 10.0001100110011........ , 我們的計算機在存儲小數(shù)時肯定是有長度限制的,所以會進行截取部分小數(shù)進行存儲,從而導致計算機存儲的數(shù)值只能是個大概的值,而不是精確的值。從這里看出來我們的計算機根本就無法使用二進制來精確的表示 2.1 這個十進制數(shù)字的值,連表示都無法精確表示出來,計算肯定是會出現(xiàn)問題的。
1、為什么數(shù)值表示用decimal 不用double
2、在程序計算中涉及到錢的時候,為什么要用Decimal而不是Float
3、MySQL數(shù)據(jù)類型DECIMAL用法
4、浮點精度(float、double)運算不精確的原因
C語言中,浮點型轉換為整型可以用:強制類型轉換、自動類型轉換,例如:(int)3.14、int a = 3.14。
1、強制類型轉換
強制類型轉換是通過類型轉換運算來實現(xiàn)的。其一般形式為:(類型說明符)(表達式),其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。
例如: (double) a 把a轉換為雙精度浮點型,(int)(x+y) 把x+y的結果轉換為整型。
2、自動類型轉換
(1)執(zhí)行算術運算時,低類型(短字節(jié))可以轉換為高類型(長字節(jié));例如: int型轉換成double型,char型轉換成int型等。
(2)賦值表達式中,等號右邊表達式的值的類型自動隱式地轉換為左邊變量的類型,并賦值給它。
(3)函數(shù)調(diào)用時,將實參的值傳遞給形參,系統(tǒng)首先會自動隱式地把實參的值的類型轉換為形參的類型,然后再賦值給形參。
(4)函數(shù)有返回值時,系統(tǒng)首先會自動隱式地將返回表達式的值的類型轉換為函數(shù)的返回類型,然后再賦值給調(diào)用函數(shù)返回。
擴展資料:
C語言中常用的數(shù)據(jù)類型:
1、int:整型
2、float:單精度浮點型
3、double:雙精度浮點型
4、char:字符型
5、char *:字符指針型
參考資料來源:百度百科-強制類型轉換
浮點型強轉整形會丟失精度,也就是小數(shù)后面的數(shù)會截掉,比如變量i時浮點型要轉換為整形時,在變量i前面加個括號,括號里面寫上你想轉的類型
(int)i
位運算符 只用于 整型。float 要轉為 整型, 否則 編譯 不能通過。 int x=2,z; float y = 2.0; z = x (int) y; // 這樣才能通過編譯。不會自動轉換。否則有“illegal“ 操作數(shù)錯誤。 printf("%x",z);
當前文章:關于go語言浮點型轉化為整形的信息
URL地址:http://www.yijiale78.com/article8/hihsip.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設計公司、全網(wǎng)營銷推廣、ChatGPT、網(wǎng)站策劃、響應式網(wǎng)站、外貿(mào)網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)