为什么C中的1.666667是5.0 / 3?

Ale*_*ung 2 c double division integer-division

我是C语言的新手,但是我像在Java中一样尝试在C中进行整数,浮点和双除,但是当我执行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;
}
Run Code Online (Sandbox Code Playgroud)

为什么对于“ secondNumber”和“ thirdNumber”得到相同的结果?

chu*_*ica 8

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

典型值double可以表示约2 64个不同的值。

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

float secondNumber = 5.0f / 3.0f; // 1.66666662693023681640625
double thirdNumber = 5.0 / 3.0;   // 1.6666666666666667406815349750104360282421112060546875
Run Code Online (Sandbox Code Playgroud)

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

1.666667
Run Code Online (Sandbox Code Playgroud)

要了解更多的数字,使用"%.10f""%.20f"@xing

printf("%.10f\n", secondNumber);
printf("%.10f\n", thirdNumber);
Run Code Online (Sandbox Code Playgroud)

输出量

1.6666666269
1.6666666667
Run Code Online (Sandbox Code Playgroud)