我正在用C语言开始编码,我正在做练习,但看到了错误的计算测试代码:
int main(){
int number;
int square;
printf("Pick a number: ");
scanf("%d",&number);
while(number<=0)
{
printf("ERROR: The number MUST be greater than zero\nPick a number greater than zero: ");
scanf("%d",&number);
}
square = pow(number,2);
printf("\nThe square of the number is: %d\n\n",square);
system("pause");
return 0;}
现在......一切正常,但是当我使用数字“5”时,它显示结果“24”,当它应该是“25”时。有人知道为什么会这样吗?
答案 0 :(得分:2)
pow
获取double
个参数并返回double
。所以你得到一个舍入误差。
答案 1 :(得分:0)
函数pow()
将double
值作为输入参数,并返回double
,因为它在C标准库中定义。但是,传递给(number
)的变量是int
变量。由于编译器在计算过程中使用非整数值,因此会导致舍入错误。
要解决此错误,请使用number
类型而不是double
声明int
:
double number;
这应该对四舍五入问题进行排序。
答案 2 :(得分:0)
因为在C标准库中,pow
被定义为一个带有双参数并返回double值的函数。即使有关实现的标准不需要,通常的实现也会使用(或多或少)以下公式: pow(x, y) = exp(y * log(x))
。这意味着即使传递整数值,内部操作也将使用非整数值,并且将发生舍入错误。
这就是你当前用5实现的情况。为了确保它,只需将结果打印为double:
double dsq = pow(5, 2);
printf("%f", dsq);
dsq
(在你的实现中)应稍微关闭,当四舍五入时你得到24
答案 3 :(得分:-2)
哼哼我认为你应该在int中施放pow:
square = (int)pow(number,2);