2012-02-15 10 views
5

Ja tam.C wynik złej sumy z deblem

uczę C i mam ten kod:

#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; 
} 

Z tym kodem, ostatni wydruk jest zawsze 0.00 ale to zmienić

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

do

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

Działa zgodnie z oczekiwaniami. Dlaczego? Podwaja nie są sformatowane jako lf?

Odpowiedz

5

"%f" dla double s (i float s, które są automagicznie przekształcane na double); %Lf jest dla long double s. Możesz przeczytać wszystkie informacje o printf specyfikatorów w C99 Standard (lub w PDF).

l w formacie specyfikatorem "%lf" nie ma wpływu: "%lf" (tak samo jak "%f") znajduje się wydrukować double s.

Twój wynik powinien być taki sam jak w przypadku dowolnego kompilatora/implementacji C99.

Według moich dokumentów, w C89, "%lf" jest nieprawidłowym specyfikatorem formatu; a jeśli używasz kompilatora/implementacji C89, to nieokreślone zachowanie, użyj go.


Należy pamiętać, że zasady dotyczące scanf są nieco inne.

-1

Powinieneś użyć %f, aby wydrukować podwójne. %lf jest tylko dla długich podwójnych.

+0

Dzięki. I na scanf powinienem użyć% f zamiast% lf? – Favolas

+0

'% Lf' jest używane dla' long double'. '% lf' powinno być takie samo jak'% f' w printf zgodnie ze standardem C99. – interjay

+1

Nr w 'scanf','% f' jest tylko dla 'float', a'% lf' dla podwójnego. (użyj '% llf' do skanowania długich podwójnych) – asaelr

3

W zmiennych listach argumentów wartości float są automatycznie konwertowane na double; char i short do int. Dlatego printf potrzebuje tylko %f dla wartości double (dla których wartości zmiennoprzecinkowe są konwertowane na).

Wskaźniki nie są konwertowane - nie miałoby to większego sensu. Z tego powodu scanf musi rozróżniać cele %f dla float i %lf dla celów docelowych double.

+0

+1 dla odniesienia faktu, że 'scanf' pobiera ** wskaźniki ** i nie podlegają one domyślnym promocjom argumentów. – pmg