Почему 5.0 / 3 это 1.666667 в C? - PullRequest
2 голосов
/ 06 июля 2019

Я новичок в языке 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'?

1 Ответ

8 голосов
/ 06 июля 2019

Типичный float может представлять около 2 32 различных значений.

Типичный double может представлять около 2 64 различных значений.

В обоих типах 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
...