Как округлить результат числа с плавающей точкой? - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь выучить C, но в настоящее время застрял.Я пытаюсь получить такой же вывод, как показано ниже, но я не уверен, как округлить последние несколько десятичных знаков в моем коде, чтобы получить тот же вывод ниже.

1. ENTER AN INTEGER
2. 5
3. DIAMETER: 10.000000
4. CIRCUMFERENCE: 31.415900
5. AREA: 78.539750

int main()
{
     float num1, diameter, circumference, area;

    printf("ENTER AN INTEGER\n");
    scanf("%f", &num1);

    diameter = 2 * num1;
    circumference = 2 * 3.14159 * num1;
    area = 3.14159 * (num1 * num1);

    printf("DIAMETER: %f\n", diameter);
    printf("CIRCUMFERENCE: %.6f\n", circumference);
    printf("AREA: %.6f\n", area);


    return 0;
}

Вывод моего результата.

1. ENTER AN INTEGER                                                                        
2. 5                                                                                       
3. DIAMETER: 10.000000                                                                     
4. CIRCUMFERENCE: 31.415899                                                                 
5. AREA: 78.539749   

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Как говорит @Eric Postpischil, ваша десятичная ошибка вызвана тем, что операции с числами с плавающей запятой (одинарная точность -32 бита) имеют небольшие ошибки точности.Двойное число (двойная точность -64 бита) решит вашу проблему точности.

Здесь у вас есть некоторая информация о трех десятичных типах: Десятичные типы

РабочийПример кода для вашей погони:

int main()
{
    double num1, diameter, circumference, area;

    printf("ENTER AN INTEGER\n");
    scanf("%lf", &num1);

    diameter = 2 * num1;
    circumference = 2 * 3.14159 * num1;
    area = 3.14159 * (num1 * num1);

    printf("DIAMETER: %lf\n", diameter);
    printf("CIRCUMFERENCE: %.6lf\n", circumference);
    printf("AREA: %.6lf\n", area);

    return 0;
}
0 голосов
/ 08 февраля 2019

В типичных реализациях C, изменение float на double и scanf("%f", &num1); на scanf("%lf", &num1); обеспечит достаточную точность для получения желаемого результата в этом случае.

В общем, вы должны ожидать небольшойошибки округления в операциях с плавающей запятой (которые могут перерасти в большие ошибки со сложными последовательностями многочисленных операций).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...