浮點數據轉換爲二進制的方法是:
1)把浮點數拆分成兩部分,小數點前面的整數和小數點後面的小數。
2)分別把整數和小數部分轉換爲二進制,保存在字符串中。
3)輸出轉換後和二進制字符串。
1、整數部分轉二進制字符串的方法
1)把十進數除以2,記下餘數(餘數保存在字符串中),現用商除以2,再記下餘數,如此循環,直到商爲0。
2)把保存餘數的字符串反過來,就是結果。
例如123轉化成二進制:
123/2=61餘1
61/2=30餘1
30/2=15餘0
15/2=7餘1
7/2=3餘1
3/2=1餘1
1/1=0餘1
結果是1101111,反過來就是1111011。
2、小數部分轉二進制字符串的方法
1)把小數乘以2,假設結果是s,如果s大於1,該位二進制值爲1,如果小於1,該位二進制值爲0;
2)把上一步的結果s去掉整數位,只保留小數位,假設得到結果xs,如果xs等於0,轉換結束,如果xs大於0,重複第1)步。
例如0.2轉換爲二進制:
0.2*2=0.4 0
0.4*2=0.8 0
0.8*2=1.6 1
0.6*2=1.2 1
0.2*2=0.4 0
…… 無限循環
浮點數123.2,轉換爲二進制的結果是1111011.00110011001100110011(小數點後保留20位)。
3、示例程序
/*
* 程序名:book.c,此程序用於把浮點數轉換爲二進制的字符串。
* 作者:C語言技術網(www.freecplus.net) 日期:20190525。
*/
#include "stdio.h"
#include <string.h>
// 把浮點數的整數部分轉換爲二進制的字符串。
// dec:待轉換的浮點數的整數部分。
// pbin:用於存放轉換後的字符串的地址。
void dectobin(const long dec,char *pbin)
{
long ys=0; // 餘數。
int s=dec; // 商。
int ii=0; // 位數的計數器。
char result[65]; // 轉換成二進制後,保存在result中,再反過來存放到pbin中。
memset(result,0,sizeof(result));
// 把浮點數的整數部分轉換爲二進制,存放在result中。
while (s>0)
{
ys=s%2;
s=s/2;
result[ii]=ys+'0';
ii++;
}
// 再把result字符串反過來,存放在pbin中。
int jj=0;
for (;ii>0;ii--)
{
pbin[jj]=result[ii-1];
jj++;
}
pbin[jj]=0; // 出於安全的考慮,加上0表示字符串結束。
}
// 把浮點數小數部分轉換爲二進制的字符串。
// decp:待轉換的浮點數的小數部分。
// pbin:用於存放轉換後的字符串的地址。
// maxp:指定pbin字符串保留的長度。
void decptobin(const double decp,char *pbin,const int maxp)
{
double xs=decp; // 小數部分。
int qz=0; // 取整的結果。
int ii=0; // 位數的計數器。
while (xs>0)
{
qz=(int)(xs*2); // 小數部分乘2取整。
pbin[ii++]=qz+'0'; // 0+'0'='0',1+'0'='1'。
xs=xs*2; // 小數部分乘2。
if (xs>=1) xs=xs-1; // 如果>=1,取整。
if (ii==maxp) break;
}
pbin[ii]=0; // 出於安全的考慮,加上0表示字符串結束。
}
int main()
{
double ff=0;
printf("請輸入一個浮點數:");
scanf("%lf",&ff);
char str1[101],str2[101];
memset(str1,0,sizeof(str1));
dectobin((long)ff,str1); // 把整數部分轉換爲二進制,保存在str1中。
decptobin(ff-(long)ff,str2,24); // 把小數部分轉換爲二進制,保存在str2中。
printf("%f的二進制輸出是:%s.%s\n",ff,str1,str2);
}
運行效果
4、版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果這篇文章對您有幫助,請點贊支持,或在您的博客中轉發此文,讓更多的人可以看到它,謝謝!!!