我尝试将基于数字的数字转换为带有C的十进制数。我有以下代码:
scanf("%d", &n);
scanf("%d %d %d %d", &n1, &n2, &n3, &n4);
dec = ( n1*pow(n,3) + n2*pow(n,2) + n3*pow(n,1) + n4*pow(n,0) );
它工作正常,直到我输入n = 10& n1 n2 n3 n4 = 0 2 5 4.
结果应为254,但终端显示为253.事实证明,从200-999开始,dec
减少了1.但是当我输入1000时,dec=1000
。我该如何解决这个问题?
答案 0 :(得分:1)
您很可能已将dec
声明为int
,而函数pow则返回double
值。这里double被转换为int a被舍入。
更改为
double dec = ( n1*pow(n,3) + n2*pow(n,2) + n3*pow(n,1) + n4*pow(n,0) );
printf("%f",dec);
,输出将是
254.000000
答案 1 :(得分:1)
虽然您提供的代码在某些实现上运行良好,例如here,但您最好不要使用pow
函数,因为您使用整数和非负数作为幂,并定义您的拥有intpow
功能。一个天真的实现将是:
int intpow(int n, unsigned int power)
{
int result = 1;
while (power)
{
result *= n;
power--;
}
return result;
}
可能是整数总和,即双精度之和,结果小于您期望看到的数字,比如0.000013
,其中小数点后面的数字是被转换为被分配给int dec
时被丢弃。
您可以通过将double
的类型更改为dec
并使用格式说明符double
进行打印来检查"%f"
结果。如果是这样的话,我的建议将是一个合适的解决方案。
你也可以尝试考虑更好的基本转换方式,因为有一种方法根本不需要(int)pow
。