分離浮點數的整數和小數部分

来源:http://www.cnblogs.com/shouce/archive/2016/03/09/5256630.html
-Advertisement-
Play Games

問題描述:如何將獲取一個浮點數的整數部分以及小數部分 方法一: 1 #include <iostream> 2 using namespace std; 3 4 void main() 5 { 6 float f = -23.04f; 7 int i = f; 8 float ff = f - i;


 問題描述:如何將獲取一個浮點數的整數部分以及小數部分

  方法一: 複製代碼
 1 #include <iostream>
 2 using namespace std;
 3  
 4 void main()
 5 {
 6      float f = -23.04f;     
 7      int i = f;
 8      float ff = f - i;
 9  
10      cout << "i=" << i << ", ff=" << ff << endl;
11 }
複製代碼

output:

i=-23, ff=-0.0400009   缺點:不能夠精確小數的位數,因為小數部分是由差求得,會丟失部分精度。   方法二: 複製代碼
 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 using namespace std;
 5  
 6 void main()
 7 {
 8      float f = -23.04f;     
 9      int i = 0;
10      float ff = 0.0f;
11  
12      stringstream ss;
13      ss << f;
14      ss >> i >> ff;
15      cout << "i=" << i << ", ff=" << ff << endl;
16 }
複製代碼

output:

i=-23, ff=0.04 缺點:小數部分無法獲取浮點數的正負號   方法三: 複製代碼
 1 void FloatData(float f)
 2 {
 3      float    fp = f;
 4      unsigned char *p = ( unsigned char *)&fp;
 5      int        nSign = 1;
 6  
 7      /*符號位*/
 8      if(*(p+ 3) & 0x80) /*獲取最高位,如果是1則為負*/
 9      {
10            nSign = - 1;
11      }
12      cout << "符號位:" << nSign << endl;
13      
14      /*獲取階碼*/
15      int hex = (*(p+ 2) & 0x80) >> 7;
16      hex |= ((*(p+ 3)& 0x7f) << 1);
17      hex -= 127;
18      cout << "階碼:" << hex << endl;
19  
20      /*數據部分*/
21      unsigned long int l_int = 0L;
22      unsigned char *q = ( unsigned char *)&l_int;
23  
24      /*數據拷貝*/
25      *q     = *p;
26      *(q+ 1) = *(p+ 1);
27      *(q+ 2) = *(p+ 2) | 0x80;
28      *(q+ 3) = 0x00;
29  
30      /*數據存儲區*/
31      l_int <<= 8;
32      cout << "整數部分:" ;
33      if(hex >= 0)
34      {
35            cout << (l_int>>( 32- 1-hex)) << endl;
36      }
37      else
38      {
39            l_int >>= -hex;
40            cout << 0 << endl;
41      }
42  
43      /*小數部分*/
44      unsigned long int tmp = 0L;
45      if(hex >= 0)
46            tmp = 1 << ( 32- 1-hex);
47      else
48            tmp = 1 << 31;
49      float sum = 0.0f;
50      for(int i= 0;i< 31;i++)
51      {
52             if((tmp & l_int) && i!= 0)
53                 sum += 1 * ( float)pow( 2.0f,-i);
54            tmp >>= 1;
55      }
56      cout << "小數部分:" << sum << endl;
57 }
複製代碼

 

方法四: 複製代碼
 1 #include <iostream>
 2 #include <sstream>
 3 #include <string>
 4 #include <cmath>
 5 #include <iomanip>    // just for setw()
 6 void splitFloat(float f)
 7 {
 8      stringstream ss;
 9      ss << setprecision( 8) << f; // 如果不設置為8,用預設是值,則會截斷小數的位數
10  
11      string str;
12      ss >> str;
13  
14      size_t pos = str.find( "-");
15      int nSign = 1;
16      if (pos != string::npos)
17      {
18            nSign = - 1;
19            str = str.substr(pos+ 1, str.length()-pos- 1);
20      }
21      cout << "nSign = " << nSign << endl;
22  
23      // 整數
24      pos = str.find( ".");
25      if (pos != string::npos)
26      {
27            string tstr = str.substr( 0, pos);
28            cout << "整數:" << atof(tstr.c_str()) << endl;
29            str = str.substr(pos, str.length()-pos);
30      }
31  
32      // 小數
33      cout << "小數:o" << atof(str.c_str()) << endl;
34 }
複製代碼    
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、求算術平方根 a=0 x=int(raw_input('Enter a number:')) if x >= 0: while a*a < x: a = a + 1 if a*a != x: print x,'is not a perfect square' else: print a else
  • 要使 StringGrid 只能上下滾動,不要左右滾動,只要加入下麵代碼即可: StringGrid1.AniCalculations.TouchTracking := [ttVertical]; ps. 此方法只適用在有觸控屏幕的裝置。
  • 列印文件操作錯誤信息 在進行文件操作是,會遇到許可權不足、找不到文件等錯誤,可以在程式中設置錯誤捕捉語句並顯示錯誤。錯誤捕捉和錯誤輸出使用用錯誤號和streero實現。 函數原型 : char *streeor(int errnum); 頭文件 #include<string.h> #include<
  • 打破一條既定規則的兩個理由: 應用這個規則將導致代碼可讀性下降。 為了和周圍的代碼保持一致。 編碼: 所有的 Python 腳本文件都應在文件頭標上如下標識或其相容格式的標識: # -*- coding:utf-8 -*- 設置編輯器,預設保存為utf-8格式。 縮進: 永遠不要混用製表符和空格。
  • 文件讀寫 文件讀寫是指從文件中讀出信息或將信息寫入到文件中。Linux文件讀取可使用read函數來實現的,文件寫入可使用write函數來實現。在進行文件寫入的操作時,只是在文件的緩衝區中操作,可能沒有立即寫入到文件中。需要使用sync或fsync函數將緩衝區的數據寫入到文件中。 文件寫操作: 函數w
  • Skills:* Computational thinking* Understand code* Understand abilities & limits* Map problems into computation 圖靈相容性:在一種語言中能做的事,在另一種語言中也能做。 變數的類型是根據它現
  • 正則表達式 ^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4]
  • 介紹 現在有兩派,有的人建議使用設計模式,有的人不建議使用設計模式!這就向寫文章一樣,有的人喜歡文章按照套路走,比如敘事性質的文章,時間,地點,人物,事件。而有的人喜歡寫雜文或者散文,有的人喜歡寫詩詞!現在寫代碼很多地方類似於寫文章,但是在有些地方比寫文章需要更多的技能!寫文章寫多了一般也能寫出優秀
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...