我想将double
转换为两个int
s:
例如当c = 0.09时:
double c=0.09; ===> int tab [2] ={0, 09}
我找tab[0]
(int)c
,但不是tab[1]
!
void char_To_Tab_Int_W(char chartab[]){
int taille=strlen(chartab);
int j=0,y=0,i,h;
while(j<taille){
char c=chartab[j]; // code ascii
printf("\n c= %d",(int)c);
h=0;
chW[0]='\0';chW[1]='\0';
while((int)c!=46){
sprintf(chW,"%s",Concat_String(chW,c));
chW[h]=c;
j++;h++;
c=chartab[j];
}// fin while et remplissage de ch
printf("\n==>ch= %s",chW);
int val= atoi(chW);
printf("\t==>val=%d",val);
tmpIntW[y]=val;
printf("\t==>tmpIntW[%d]=%d",y,tmpIntW[y]);
j++;y++;
}
printf("\nCharTabRecu : ");
for(i=0;i<y;i++){
printf("%d ",tmpIntW[i]);
}
}
在main()
:
int main(){
double w=0.09;
printf("w1=%d", (int)w);
printf("\nreste= %f" ,(w-(int)w));
int j;
char chartabw[100];
sprintf(chartabw, "%f", w);
char_To_Tab_Int_W(chartabw); // je rempli tmpIntTabRecu
printf("\nTabW : ");
for(j=0;j<2;j++){
tabW[j]=tmpIntW[j];
printf("%d ",tabW[j]);
}
return 0;
}
但这并没有给我结果。
有什么想法吗?
答案 0 :(得分:0)
将double转换为两个int的数组
使用round()
OP的代码试图使用各种文本/数学将许多问题(缓冲区大小,舍入,否定)与打印版本(小数点后六位)分开double
。
让我们尝试一种新方法并使用整数。
似乎不仅代码分成2个整数,派系部分舍入到最接近的0.01。关键问题是数字应该在分离之前舍入,以处理传播到整数部分的舍入效应。 @Lưu Vĩnh Phúc
// Since converting to `int`, insure number is not too big.
assert(INT_MIN <= c && c <= INT_MAX);
// scale and round
double t = round(c*100.0);
tab[1] = (int) fmod(t, 100.0);
tab[0] = (int) (t/100.0);
printf("%d.%02d\n", tab[0], abs(tab[1]));
另一种方法稍微简单一点。
long long tll = (long long) round(c*100.0);
tab[1] = (int) (tll%100);
tab[0] = (int) (tll/100);
double c=0.09; ===> int tab [2] ={0, 09}
是错误的C代码,因为以0
开头的整数常量被视为八进制,而09
是无效的八进制。 @Cool Guy