C неправильная сумма результата с двойными - PullRequest
5 голосов
/ 15 февраля 2012

Я там.

Я изучаю C и у меня есть этот код:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    double buyval, deliveredval, change;

    printf("What's the buy value? ");
    scanf("%lf", &buyval);

    do{
        printf("What's the value delivered? ");
        scanf("%lf", &deliveredval);

        if (deliveredval < buyval){
            printf("Delivered value must be greater then buy value \n\n");
        }
    } while (deliveredval < buyval);

    change = deliveredval - buyval;

    printf("Change is %4.2lf", change);
    return 0;
}

С этим кодом последний отпечаток всегда равен 0,00, но я изменяю

printf("Change is %4.2lf", change);

до

printf("Change is %4.2f", change);

Работает как положено.Это почему?Двойники не отформатированы как lf?

Ответы [ 3 ]

5 голосов
/ 15 февраля 2012

"%f" для double с (и float с, которые автоматически преобразуются в double);%Lf для long double с.Вы можете прочитать все о спецификаторах printf в C99 Standard (или в PDF ).

l в форматеспецификатор "%lf" не имеет никакого эффекта: "%lf" (то же самое, что и "%f") предназначен для печати double s.

Ваш результат должен быть таким же, как и у любого нормального компилятора / реализации C99.

Согласно моим документам, в C89 "%lf" является неверным спецификатором формата;и если вы используете компилятор / реализацию C89, то его использование не определено.


Обратите внимание, что правила для scanf немного другие.

3 голосов
/ 15 февраля 2012

В списках переменных аргументов float значения автоматически преобразуются в double; char и short до int. Следовательно, printf требуется только %f для значений double (в которые преобразуются значения с плавающей точкой).

Указатели не конвертируются - это не имеет особого смысла. По этой причине scanf необходимо различать %f для float целей и %lf для double целей.

0 голосов
/ 15 февраля 2012

Вы должны использовать %f для печати двойных чисел.%lf только для длинных пар.

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