不同的答案:两个简单相同的整数计算?

10

以下有两个场景,操作看起来是相同的,但结果相差1。我认为我不需要解释编程,它非常简单。

首先是变量声明,情况1为1),情况2为2),每个情况下获得的结果最后列出。

任何帮助将不胜感激。

int intWorkingNumber = 176555;

int intHundreds = 1;

int intPower = 1;

1)

int intDeductionValue = (intHundreds * 100 * pow(1000, intPower));

intWorkingNumber -= intDeductionValue;  

intWorkingNumber = 76555

2)

intWorkingNumber -= (intHundreds * 100 * pow(1000, intPower))

intWorkingNumber = 76554

'double pow( double base, double exp );' - 浮点运算不是整数运算,所以你得到的结果是可以预料的。 - Martin James
感谢J Steen编辑我的问题-代码的缩进格式已经注意到了。 - Beginner
@Mark 注意句末的问号-这句话意味着“这两个简单的整数计算是相同的吗?”。无论如何,感谢您的帮助。 - Beginner
1个回答

17
两个代码示例的区别在于强制转换为int的时间点。
第一个版本类似于这个代码,在减法之前先将其转换为整数。
intWorkingNumber = 176555 - (int)(1 * 100 * pow(1000, 1));
第二个版本与此类似,在执行减法运算后,您将其转换为整数。
intWorkingNumber = (int)(176555 - (1 * 100 * pow(1000, 1)));

pow函数返回一个浮点数。如果1 * 100 * pow(1000, 1)的结果不精确地等于100000.0000(并且使用浮点运算时,通常不应该依赖于精确的结果),这两个值是不等价的。

考虑这个更简单的例子:

x = 10 - (int)0.001;   // x = 10 - 0;     => x = 10
y = (int)(10 - 0.001); // y = (int)9.999; => y = 9

3
需要说明的是,为了更好地理解,必须提到pow函数返回一个浮点数。 - Puppy
@DeadMG:提到了。感谢您的评论。 - Mark Byers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接