这是源代码的示例
#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
作为输出。
更改此行:
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
。
pow(10,i)
是 99.99999999999,然后下限为整数 a=99
您也可以创建自己的整数重载pow(int,int)
。
日安。
更改 FPU 舍入模式。从舍入到零到四舍五入到最接近。C 标准中没有定义如何执行此操作,因此您需要使用一些内在指令或一些内联汇编程序。
使用 ceil()
将值double
舍入为整数,只是分配与 floor()
相同 - 在您的情况下,它是截断浮点数的小数部分double
数字(正数(。您可能还会发现数学四舍五入很有用 - floor(x + 0.5)
表示正x
,ceil(x - 0.5)
表示负四舍五入。
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
'ing a 后a = pow(10, i);
来验证我的意思。
您可以通过将a
声明为long
来解决此问题。值得一试...
最好是将pow
的返回值存储为double
或float
,而不是int
!