【问题标题】:Why `double i = 3.3, j = 1.1; int k = i/j; printf("%d\n", k);` gets 2? [duplicate]为什么`double i = 3.3, j = 1.1;诠释 k = i/j; printf("%d\n", k);` 得到 2? [复制]
【发布时间】:2014-02-15 06:09:17
【问题描述】:

发现double/double的结果不正确:

double i = 3.3, j = 1.1;
int k = i/j;
printf("%d\n", k);

结果是 2,为什么?
调试:

但是:

float i = 3.3, j = 1.1;
int k = (int)(i/j);
printf("%d\n", k);

调试:

【问题讨论】:

  • 当然结果是 2。这里真正的问题是为什么你认为它会是其他任何东西,特别是你认为结果应该是什么?
  • @HighPerformanceMark 我认为您能够自己回答这些真正的问题 :)。
  • 我认为应该是 3 而不是 2。
  • 为什么你认为应该是3?如果doubledouble,您认为i/j 的价值是多少?
  • 只是好奇你从哪里得到调试屏幕:P

标签: c floating-point int double


【解决方案1】:

3.2999 / 1.10 给出 2.99 以及转换为整数时会产生输出 2

【讨论】:

    【解决方案2】:
    double i = 3.3, j = 1.1;
    int k = i/j;
    

    由于十进制数在内存中的表示方式,i/j 的结果实际上是 2.999999...编译器会将结果 i/j 从 double 转换为 int,因为 k 是 int。这就是你最终得到 2 的结果

    【讨论】:

    • 我想他知道编译器会将其转换为int。问题是为什么结果整数是 2 而不是 3,因为 3.3/1.1 = 3。
    【解决方案3】:

    double 不能代表 3.3,即使您在代码中编写 3.3,double 也会将其存储为 3.2999999999999998。 (它也不能精确存储 1.1,它将是 1.1000000000000001)

    所以i/j 正在执行 3.2999999999999998/1.1000000000000001,其结果将存储为 2.9999999999999996

    将 double 转换为 int 会截断该值,它不会将其四舍五入为最接近的整数,因此 2.9999999999999996 将转换为 2

    This 也适用于具有 IEEE 754 浮点数的 C,并且有许多其他资源。

    【讨论】:

      【解决方案4】:

      如您所知,3.3 不能以二进制格式正确表示,1.1 相同,评估 k = i/j 会导致

      3.2999999999999998 / 1.1000000000000001  < 3
      

      将此分配给int 类型k 将其截断为2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-16
        • 2013-04-22
        • 1970-01-01
        • 2014-11-25
        • 2020-09-14
        • 1970-01-01
        • 2021-02-28
        相关资源
        最近更新 更多