把double类型转换成BCD链时出现问题
现有一c程序,作用是把整数部分为两位的double类型转化成定长BCD链例如:
有一个 double 类型的数字是 2.87
相应的3位BCD链中的内容是 0X02,0X87,0X00
我写了一个转换函数如下:
unsigned char * Dou2BcdCh(double data,int len){
//将double类型转化为BCD链
//data待转换的double类型数据,它的整数部分最多两位,最少0位
//len BCD链的总长
int i,k;
int i,k;
unsigned char *Chain;
double temp=data;
int integer;
printf("data is %lf \r\n",data);
Chain=(unsigned char*)malloc(
len*sizeof(unsigned char)
);
for(i=0;i<len;i++){
k=1;
while(temp>=(double)(1.0)){
temp=temp-(double)(1.0);
printf("*****while*****%d\r\n",k);
k++;
}
integer=data-temp;
printf("data is %lf,temp is %lf ,integer is %lf,%d\r\n",data,temp,integer,integer);
Chain[i]=Dec2Bcd(integer);//Dec2Bcd 将一个两位整数转化为相应的BCD码
data=temp*(double)(100.0);
printf("data = %lf \r\n",data);
temp=data;
printf("temp= %lf\r\n",temp);
}
for(i=0;i<len;i++)
printf("0X%x ",Chain[i]);
printf("\r\n");
return Chain;
}
调试中出现的问题如下:
对于 输入2.87 正确的输出 应该为
0x2 0x87 0x00
实际上的输出却为
0x2 0x86 0x99
对于 输入 2.15 正确的输出 应该为
0x2 0x15 0x00
实际上的输出为
0x2 0x14 0x99
观察程序输出结果,感觉最有可能是while循环那里除了问题,
但是真实的原因是什么呢?解决方案是?
谢谢各位!
附:
1.
unsigned char Dec2Bcd(int dec)
{
unsigned char bcd,high,low;
high=dec/10;
low=dec%10&0x0f;
bcd=high<<4|low;
return bcd;
}