以部门为单位的类型转换

Type conversion in divisions

本文关键字:类型转换 为单位      更新时间:2023-10-16

我目前想知道为什么以下操作 20/(10.0/6( 在使用 C++ 时导致 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

第一件事是 12 是表达式的真实值:

                    20      20 * 6      120
20 / (10.0 / 6) = ------ = -------- = ------ = 12
                    10        10        10
                   ----
                    6

第二件事是浮点具有有限的精度。Double 有 52 位尾数,接近 16 位十进制数字。

所以十进制值 10/6 接近 1.6666666666666667。但在内部它是二进制数 - 接近1.66666666666666667406815349750104360282421112060547 如果我们可以直接用十进制表示二进制 - 我们不能。

上面的等式计算结果非常接近 12,这就是返回的内容 - 甚至是双倍。