分部中的类型转换

时间:2017-03-15 14:18:14

标签: c++ type-conversion

我目前想知道为什么在使用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

1 个答案:

答案 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即返回的内容 - 即使是双倍。