C++类型转换问题

use*_*633 10 c++

考虑以下代码:

#include <iostream>

using namespace std;

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

int main()
{
    cout << aaa(35000);
}
Run Code Online (Sandbox Code Playgroud)

打印出来:

10500
10499
Run Code Online (Sandbox Code Playgroud)

为什么输出不同?

我有一个解决方法,使用"返回*3/10;" 但我不喜欢它.

编辑:

发现做"返回浮动(a*0.3);" 给出期望值;

Jon*_*oni 8

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

  • 这是。事实上,10500 可以*完全* 表示为一个浮点数,如果乘法是用 64 位进行的,结果应该是 10500 *总是*。问题是,某些系统对中间值使用 80 位精度。这使得 0.3 比 3/10 略小,当乘法结果四舍五入时,最后一位是错误的。 (2认同)

Bal*_*Pal 6

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

应该小心地进行float-int转换,最好不要这样做.