10

考虑以下代码:

#include <iostream>

using namespace std;

int aaa(int a) {
    cout << a * 0.3 << endl;
    return a * 0.3;
}

int main()
{
    cout << aaa(35000);
}

它打印出来:

10500
10499

为什么输出不同?

我有一个解决方法来使用“return a * 3 / 10;” 但我不喜欢它。

编辑:

发现做“return float(a * 0.3);” 给出期望值;

4

3 回答 3

9

0.3*35000 的结果是一个浮点数,略小于 10500。打印时它被四舍五入为 10500,但当强制转换为 int 时,小数位被丢弃,结果为 10499。

于 2013-06-29T13:09:20.253 回答
6

int * double表达式产生双倍,这就是第一件事打印的内容。然后你转换为int切碎剩余的部分(即使它几乎在那里,坐在 10500-DBL_EPSILON),并将其传回。第二个打印该值。

浮点整数转换应该小心,最好不要。

于 2013-06-29T13:07:26.607 回答
2

a * 0.3有类型double。内部aaa调用调用

ostream& operator<< (double val);

而外面的人打电话

ostream& operator<< (int val);

你会收到一个警告(如果你打开它们——我建议你这样做),不推荐隐式转换 from doubleto 。int

于 2013-06-29T13:08:01.670 回答