如果需要将十六进制的小数转为十进制的小数,可分别提取这个十六进制的整数部分和小数部分,然后分别将整数部分和小数部分转为十进制,最后输出十进制的整数部分和小数部分的和即可。
代码如下:
参考链接:
https://www.xiao84.com/tools/103105.html
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void){
// char numStr[25]= "2B.38";
//获取输入的二进制小数
char numStr[25];
printf("请输入二进制小数:");
scanf("%s",numStr);
// http://c.biancheng.net/view/340.html
// 获取小数部分
char * fractionalPart = strchr(numStr,'.');
char integerPart[25] ;
// 获取整数部分
// https://blog.csdn.net/as480133937/article/details/120856299
if (fractionalPart==NULL){
strcpy(integerPart,numStr);
}else{
char *p;
int i=0;
for(p=numStr;p<fractionalPart;p++,i++){
integerPart[i] = *p;
}
integerPart[i] ='\0';
}
// printf("整数部分为:%s\n",integerPart);
// printf("小数部分为:%s\n",fractionalPart+1);
//
//
double weight = 1;
int integerSum=0;
int single ;
// 将整数部分转为十进制
for(int i=strlen(integerPart)-1;i>=0;i--){
char ch = integerPart[i];
// https://www.runoob.com/cprogramming/c-function-toupper.html
ch = toupper(ch); // 转为大写
if(ch>='0'&&ch<='9'){
single = ch-'0';
}else if(ch>'A'&&ch<='Z'){
single = ch-'A'+10;
}
integerSum += single *weight;
weight*=16;
}
// printf("整数部分转为十进制为:%d\n",integerSum);
weight = 1.0/16;
double fractionalSum=0;
// 将小数部分转为十进制
for(int i=1;fractionalPart!=NULL&&i<strlen(fractionalPart);i++){
char ch = fractionalPart[i];
// https://www.runoob.com/cprogramming/c-function-toupper.html
ch = toupper(ch); // 转为大写
if(ch>='0'&&ch<='9'){
single = ch-'0';
}else if(ch>'A'&&ch<='Z'){
single = ch-'A'+10;
}
fractionalSum += single *weight;
//printf("fractionalPart[%d]=%c, single=%d, weight=%f,single *weight=%f ,fractionalSum=%f\n ",
//i,fractionalPart[i],single,weight,single*weight, fractionalSum);
weight/=16;
}
// printf("小数部分转为十进制为:%f\n",fractionalSum);
double sum = integerSum + fractionalSum;
// 打印结果
// https://www.xiao84.com/tools/103105.html
printf("%s转为十进制为:%f\n",numStr,sum);
return 0;
}