我目前想知道为什么在使用C ++时,以下操作20 /(10.0 / 6)导致12(双)。 10.0是双精度数,20和6是整数。 (10.0 / 6)得到1.66,因为6首先变为双。但为什么20 / 1.66然后是12而不是12.05?
示例程序:
#include <iostream>
using namespace std;
int main()
{
cout << "20 / (10.0 / 6): " << (20 / (10.0 / 6)) << endl;
return 0;
}
示例会话(gcc,cygwin,Windows 10 - 64位):
$ echo -e '#include <iostream>
> using namespace std;
> int main()
> {
> cout << "20 / (10.0 / 6): " << (20 / (10.0 / 6)) << endl;
> return 0;
> }
> ' > test-div.cc
$ g++ -o test-div test-div.cc
$ ./test-div.exe
20 / (10.0 / 6): 12
答案 0 :(得分:3)
首先是12是表达式的真值:
20 20 * 6 120
20 / (10.0 / 6) = ------ = -------- = ------ = 12
10 10 10
----
6
第二件事是浮点具有有限的精度。 Double有52位尾数,接近16位十进制数。
所以十进制值10/6接近1.6666666666666667。但在内部它是二进制数 - 接近 1.6666666666666667406815349750104360282421112060547如果我们可以直接用十进制表示二进制 - 我们不能。
上面的等式评估如此接近12即返回的内容 - 即使是双倍。