6307

【C】〔無條件捨去〕如何忽略float數據 直接儲存成int型態(數據100%不失真)

“
a148: You Cannot Pass?! 解題時所意外研究出來的神奇寫法,懂了原理之後要自行改寫成四捨五入或無條件進位應該就簡單了吧!
„

分享此文連結 //n.sfs.tw/14843

分享連結 【C】〔無條件捨去〕如何忽略float數據 直接儲存成int型態(數據100%不失真)@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2020-12-04 04:23:48 最後編修
2020-12-04 03:49:52 By 過路君子
 

哈囉大家好,這裡是把一個很簡單的題目搞得很複雜的小編過路君子

真的不知道有沒有必要,總之就是研究出了這種寫法,紀錄一下,說不定以後會用到

 

直接儲存成float在轉換格式儲存成int是會遇到問題的,舉個最簡單的例子,如果今天要儲存的數字是58.999999999,各位可以試試看,先將其存進float格式的變數裡面,然後再轉存成int之後printf出來會出現什麼。

小編已經嘗試過了,就直接跟大家說吧,會輸出59,如果是未經轉存就輸出則會輸出59.000000,這跟float在電腦內部的表示方式有關係,有興趣者可以查一下「IEEE 754」小編在這就不贅述了。

對了,用double也是一樣的結果,所以這條路就死心吧^ ^,如果用double還可以正常顯示數字就代表你的浮點數還不夠大,不信各位可以測試輸入58.999999,小編保證float和int一樣會輸出59,但是double卻會正確輸出58.999999

每張圖片點擊皆可放大喔!

 

所以結論,直接餵入資料在強制轉換成int這招不行,你資料都失真了,怎麼可能轉換之後會變回正確的?至於這篇為什麼難得是小編寫C語言的介紹呢?因為C的#include<stdlib.h>裡面有個非常好用的函數 —— atoi()

餵入一個char陣列,就會返回一個int的值!這裡有一點要注意的就是,直接餵入string字串會編譯編不過。

而返回的int值就是char陣列所對應的整數,繼續以上面58.999999999為例,餵入後atoi返回的值為何呢?答案就是58!

 

所以其實我們要做的事情也很簡單,也就是將資料改儲存成字串之後餵入 atoi()裡面,然後用一個變數去接住。

最後一樣有示範程式碼,相關題目往這裡走,那下方就是完整的題目解答,再下面一樣會附上小編的解題過程。

 

完整程式碼(解答):

 

解題過程:

 

 

 

後記:

猜猜這題最最最最最關鍵的地方在哪裡?在倒數第八行(e>59)不是(e>=59)為了這個等號又找了兩個半小時,找到新的程式寫法都出來了還是無法解決,無奈之下去參考了別人的程式。

你能想像小編當下多麼崩潰嗎?拿到=之後就AC了......

END

你可能感興趣的文章

【SeaChest & Synology】512e(Advanced Format / AF) 轉換至 4Kn 好不容易入手了一顆硬碟,但是卻無法使用,除了賣掉還有更好的方法嗎?

【Minecraft】[CoreProtect|BungeeCord]如何重新命名世界或維度名稱 當只有一個伺服器的時候,問題往往處理起來非常簡單,但是一旦當伺服器成長至兩台以上,事情便開始有趣了起來

【Maven】如何夾帶檔案至Jar內以及其讀取方式 想要讀取一個外部的文字文件?Maven是你的好幫手

【C++】使用struct array和一維int array模擬二維int array 主要是因為用sort去排序int array的二維陣列小編懶得研究,於是就研究了一種維持一維陣列但是有二維陣列效果的程式,小編就廢~~

【Maven】[Wicket](Java) 如何部署Wicket到Wildfly內 Wicket 是一個 Java 下的套件,換言之,我們的網頁伺服器後端是由 Java 來撰寫的

【C++】如何解決TLE,換句話說便是加速cin, cout的執行速度 [ZERO JUDGE](UVa) a159: 11743 - Credit Check 題目練習和副程式練習

隨機好文

【札記】在發文上遇到的問題 如果遇到問題,是選擇丟在一旁還是將其解決,又或者是看情況?

小穹‧動畫化‧體驗記④  美麗島站附近的某家便利商店內,蕾蕾坐在用餐區的桌椅上,盯著玻璃牆外的夜色發呆。   在

【數學】高二上 三角函數公式 筆記筆記,方便以後複習之用

【英文作文】如何寫好英文作文 ~英文作文基本架構 從最簡單的英文作文框架開始下手,也就是俗稱的套公式,雖然很笨,但不失一個好辦法。

三民(乙) Book.4 Unit 4 單字和片語 給某個常常忘記帶單字本的小編…

精讚::