2012-02-15 8 views
5

Yo allí.C resultado de suma incorrecta con dobles

estoy aprendiendo C y tengo este código:

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

Con este código, la última impresión es siempre 0.00 pero es cambio

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

a

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

Funciona como se esperaba. ¿Porqué es eso? ¿Dobles no están formateados como lf?

Respuesta

5

"%f" es para double s (y float s que se convierten a double automágicamente); %Lf es para long double s. Puede leer todo acerca de printf especificadores en el C99 Standard (o en PDF).

El l en el especificador de formato "%lf" no tiene ningún efecto: "%lf" (el mismo que "%f") es imprimir double s.

Su resultado debe ser el mismo que el de cualquier compilación/implementación C99.

Según mis documentos, en C89, "%lf" es un especificador de formato no válido; y si está utilizando un compilador/implementación C89, es un Comportamiento Indefinido. Úselo.


Tenga en cuenta que las reglas para scanf son un poco diferentes.

-1

Debe usar %f para imprimir en dobles. %lf es solo para dobles largos.

+0

Gracias. Y en el scanf debería usar% f en vez de% lf? – Favolas

+0

'% Lf' se usa para' long double'. '% lf' debe ser igual que'% f' en printf según el estándar C99. – interjay

+1

No. en 'scanf','% f' es solo para 'float', y'% lf' es para double. (use '% llf' para escanear el doble largo) – asaelr

3

En las listas de argumentos variables, los valores de float se convierten automáticamente a double; char y short a int. Por lo tanto, printf solo necesita %f para los valores double (a los que se convierten los valores flotantes).

Los punteros no se convierten; esto no tendría mucho sentido. Esta es la razón por la cual scanf necesita distinguir entre %f para objetivos float y %lf para objetivos double.

+0

+1 para referir el hecho de 'scanf' toma ** punteros ** y estos no están sujetos a promociones de argumento predeterminadas. – pmg

Cuestiones relacionadas