以下是源代码示例
#include <iostream.h>
#include <conio.h>
#include <math.h>
int main()
{
int i=2,a;
a= pow(10,i);
int b=0;
b+=a;
cout<<b;
getch();
}
我希望的输出是100
,因为很明显。但是编译器将99
作为输出。任何人都可以解释代码中的问题是什么,以及如何纠正以100
作为输出。
答案 0 :(得分:2)
pow(10,i)
是99.99999999999,然后被覆盖到整数a = 99
您也可以创建自己的pow(int,int)
整数重载。
美好的一天。
答案 1 :(得分:2)
更改此行:
a = round(pow(10,i));
您可以将round
函数编写为:
int round(double r) {
return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5);
}
注意: pow()
会返回一个双精度数字,因此避免此类问题的最佳方法是将a
加倍,而不是int
。
答案 2 :(得分:0)
更改FPU舍入模式。从圆形转换为零到圆形到最近。如何在C标准中定义,因此您需要使用一些内部指令或一些内联汇编程序。
答案 3 :(得分:0)
您需要使用ceil()
将double
值舍入为整数,只需赋值与floor()
相同 - 它会截断浮点double
中的小数部分你的情况(正数)。您也可以发现数学四舍五入有用 - floor(x + 0.5)
为正x
,ceil(x - 0.5)
为负数。
答案 4 :(得分:0)
pow的文档如下:
#include <math.h>
double pow (double x, double y)
long powl (long double x, long double y)
float powf (float x, float y)
所以pow(10, 2)
是double
,可能会被计算为99.99999999999
所以你的行
a = pow(10, i)
将99.99999999999
存储到int
,因此发生了截断,a
变为99
!
在cout
之后尝试a = pow(10, i);
来验证我的意思。
您可以通过将a
声明为long
来解决此问题。值得一试......
最好将pow
的返回值存储为double
或float
,而不是int
!