为啥 5.0/3 在 C 中是 1.666667?

Posted

技术标签:

【中文标题】为啥 5.0/3 在 C 中是 1.666667?【英文标题】:Why 5.0/3 is 1.666667 in C?为什么 5.0/3 在 C 中是 1.666667? 【发布时间】:2019-07-05 22:04:37 【问题描述】:

我是 C 语言的新手,但我尝试过 C 中的整数、浮点和双除法,就像我通常在 Java 中所做的那样,但是当我执行 5.0/3 而不是 1.6666666666666667 时,我得到 1.666667 的双倍除法和浮点除法。

我曾像往常一样尝试使用 Visual Studio 执行程序,但我收到消息“第一个数字是 1,第二个是 1.666667,最后一个是 1.666667。”执行后:

#include <stdio.h>

int main()

    int firstNumber = 5 / 3;
    float secondNumber = 5.0f / 3.0f;
    double thirdNumber = 5.0 / 3.0;

    printf("First number is %d, second one is %f and the last one is %lf.", firstNumber, secondNumber, thirdNumber);
    return 0;

为什么“secondNumber”和“thirdNumber”的结果相同?

【问题讨论】:

Is floating point math broken?的可能重复 Ppl,这个问题与标记为“dupe”无关,这个问题是合法的,似乎是原创的。 【参考方案1】:

典型的float 可以表示大约 232 个不同的值。

典型的double 可以表示大约 264 个不同的值。

在这两种类型中,除法的确切商 5/3 不在该集合中。而是使用附近的值(一些二进制分数)。

float secondNumber = 5.0f / 3.0f; // 1.66666662693023681640625
double thirdNumber = 5.0 / 3.0;   // 1.6666666666666667406815349750104360282421112060546875

使用"%f" 时,使用小数点后6 位。打印的文本是圆形的。在这两种情况下,都四舍五入。

1.666667

要查看更多数字,请使用"%.10f""%.20f" 等@xing

printf("%.10f\n", secondNumber);
printf("%.10f\n", thirdNumber);

输出

1.6666666269
1.6666666667

【讨论】:

以上是关于为啥 5.0/3 在 C 中是 1.666667?的主要内容,如果未能解决你的问题,请参考以下文章

为啥指向未定义结构的指针有时在 C 和 C++ 中是非法的

为啥 -1**2 在 JavaScript 中是语法错误?

为啥向下转换在 C++ 中是一种不好的做法,而不是在另一种语言中呢? [关闭]

为啥在 javascript 中是 = this? [复制]

为啥斜线在 JSON 中是可转义字符? [复制]

为啥局部变量在 Java 中是线程安全的