C语言,36进制以内的浮点数任意进制互相转换

本文分享了一种使用C语言实现的浮点数进制转换方法,通过将浮点数先转换为十进制,再从十进制转换为目标进制,解决了精度问题。文章详细介绍了如何处理整数和小数部分,以及如何避免常见错误。

最近在复习考研的c语言编程,对于我这种总是用C++刷题的突然一下不能用C++只能用C了还是有点难受,想要多练练。然后我就遇到了一道浮点数进制转换的题目,按理说是很简单的,但是小数部分的进制转换我却想了半天,发现必须要用字符串处理,不然会出现很多精度问题。然后我想百度看看别人的解决方法,结果找到的都是在线进制转换器= =,所以在这里记录一下我的方法。

#include<stdio.h>
#include<string.h>
#include<math.h>

char* hexConvert(char* num,int begin,int end)//将浮点数num从begin进制转化成end进制(36进制以内)
{
	//先转化成十进制便于计算
	double eps = 1e-8;//精度为1e-8,如果对精度要求高可以调小
	int int_D = 0;//十进制整数部分
	double dec_D = 0;//十进制小数部分
	double indexf = 1.0 / double(begin);//小数部分相应位的权重
	bool isInt = true;
	for (int i = 0; i < strlen(num); i++)
	{
		if (num[i] == '.')//找到小数点,后面的是小数位
		{
			isInt = false;
			continue;
		}
		if (isInt)//处理整数位
		{
			int_D *= begin;
			if(num[i]>='0'&&num[i]<='9')
				int_D += (num[i] - '0');
			if (num[i] >= 'a' && num[i] <= 'z')
				int_D += (num[i] - 'a' + 10);
		}
		else//处理小数位
		{
			if (num[i] >= '0' && num[i] <= '9')
				dec_D += indexf * (num[i] - '0');
			if (num[i] >= 'a' && num[i] <= 'z')
				dec_D += indexf * (num[i] - 'a' + 10);
			indexf /= double(begin);
		}
	}

	//将转化好的十进制转化为目标进制
	char* ans;//答案字符串
	char int_T[1005], dec_T[1005];//目标进制的整数部分和小数部分
	int int_T_index = 0, dec_T_index = 0;
	int tmp;
	while (int_D)//处理整数位
	{
		tmp = int_D % end;
		if (tmp >= 0 && tmp <= 9)
			int_T[int_T_index++] = '0' + tmp;
		if (tmp >= 10 && tmp <= 35)
			int_T[int_T_index++] = 'a' + tmp - 10;
		int_D /= end;
	}
	int_T[int_T_index] = '\0';
	ans = _strrev(int_T);//整数部分是先获取的低位后获取的高位,所以要反转,strrev函数被_strrev替代了
	indexf = 1.0 / double(end);
	while (fabs(dec_D)>=eps)//处理小数位,dec_D如果小于精度就默认为0,跳出循环,否则当作不为0,继续处理
	{
		tmp = int(dec_D / indexf);
		if (tmp >= 0 && tmp <= 9)
			dec_T[dec_T_index++] = '0' + tmp;
		if (tmp >= 10 && tmp <= 35)
			dec_T[dec_T_index++] = 'a' + tmp - 10;
		dec_D -= tmp * indexf;
		indexf /= end;
	}
	dec_T[dec_T_index] = '\0';
	strcat(ans, ".");
	strcat(ans, dec_T);
	return ans;
}

123.456从7进制转18进制结果是3c.c7fc7fc

asdf.jklm从32进制转24进制结果是11j9n.ehf3e

测试了几条结果,与在线进制转换器的结果都是一致的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值