c语言实现float型数据转成BCD数据
本文简要介绍了float型数据和BCD编码数据之间的转换,并可选择保留的小数位数0,1,2,3
·
一.简述
使用BCD编码方式可以更大限度的节省字节空间,使用四位二进制保存一个十进制数。本文完成了float型数据转换为BCD编码方式的转换,并且根据保留小数点后的位数做出对应的转换。
二.代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/**
* @brief 将float转为bcd
*
* @param input:输入的float型数据
* decimal_num:要保留的小数位数
* output_buf:输出缓存区
* output_num:最终转换输出字节数
*
* @return void
*
*/
void float_to_bcd(const float input, int decimal_num, char* output_buf,int *output_num)
{
int i = 0;
int len_temp = 0;
int len_final = 0; //最中组成的strbuf长度
char string_buffer[20] = {0}; //定义临时缓存区
//根据保留的小数位数做不同操作
switch (decimal_num)
{
case 0:
sprintf_s(string_buffer, "%.0f", input); //将输入的float型变量进行格式化输出
break;
case 1:
sprintf_s(string_buffer, "%.2f", input); //将输入的float型变量进行格式化输出
len_temp = strlen(string_buffer); //获取格式化后的数据长度
memmove(string_buffer + len_temp - 3, string_buffer + len_temp - 2, 1); //内存移动,可以重叠
string_buffer[len_temp - 2] = 0; //添加结束符
break;
case 2://两位小数部分
sprintf_s(string_buffer, "%.3f", input); //将输入的float型变量进行格式化输出
len_temp = strlen(string_buffer); //获取格式化后的数据长度
memmove(string_buffer + len_temp - 4, string_buffer + len_temp - 3, 2); //内存移动,可以重叠
string_buffer[len_temp - 2] = 0; //添加结束符
break;
case 3:
sprintf_s(string_buffer, "%.4f", input); //将输入的float型变量进行格式化输出
len_temp = strlen(string_buffer); //获取格式化后的数据长度
memmove(string_buffer + len_temp - 5, string_buffer + len_temp - 4, 3); //内存移动,可以重叠
string_buffer[len_temp - 2] = 0; //添加结束符
break;
default:break;
}
len_final = strlen(string_buffer);
printf("len_final = %d string_buffer = %s\n", len_final, string_buffer);
//string到BCD的转换
if (len_final % 2) //一共有奇数位
{
output_buf[0] = string_buffer[0] - '0';
for (i = 0; i < (len_final - 1) / 2; i++)
{
output_buf[i + 1] = (string_buffer[2 * i + 1] - '0') << 4 | (string_buffer[2 * i + 2] - '0');
}
}
else //一共有偶数位
{
for (i = 0; i < len_final / 2; i++)
{
output_buf[i] = (string_buffer[2 * i] - '0') << 4 | (string_buffer[2 * i + 1] - '0');
}
}
*output_num = len_final % 2 + len_final / 2; //获取最终产生的字节数
}
int main(void)
{
int i = 0;
int len_final = 0;
float a = 12142.01023;
char bcd_buffer[10];
//float_to_bcd(a, 0, bcd_buffer, &len_final); //保留0位小数
//float_to_bcd(a, 1, bcd_buffer, &len_final); //保留1位小数
//float_to_bcd(a, 2, bcd_buffer, &len_final); //保留2位小数
float_to_bcd(a, 3, bcd_buffer, &len_final); //保留3位小数
for (i = 0; i < len_final; i++)
{
printf("%x ", bcd_buffer[i]);
}
return 0;
}
三.执行结果
//保留0位小数
len_final = 5 string_buffer = 12142
输出的BCD数据:01 21 42
//保留1位小数
len_final = 6 string_buffer = 121420
输出的BCD数据:12 14 20
//保留2位小数
len_final = 7 string_buffer = 1214201
输出的BCD数据:01 21 42 01
//保留3位小数
len_final = 8 string_buffer = 12142009
输出的BCD数据:12 14 20 09

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)