【问题标题】:Type conversion in divisions分部的类型转换
【发布时间】:2017-08-06 08:20:22
【问题描述】:

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

【问题讨论】:

  • 你如何检查结果?您是否分配给 int 变量?
  • (10.0/6) 实际上是1.6666666666666667(在大多数系统上)。更高的精度,你可以看到除法的结果实际上是11.99999999999999976,当存储在double中时,它会四舍五入为12.0
  • 请发布示例代码以展示您在此方面的研究。为什么你认为结果是 12?
  • @machinery 我做了一个简单的示例,可以确认 12。(cygwin,gcc)Windows 7 计算器也计算 12。
  • 如果我们谈论的是实数,20/(10/6) 大约是20*(6/10),这与(20/10)*6 差不多。有时您需要忘记编程。

标签: c++ type-conversion


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2016-10-19
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多