2016-06-10 4 views
0

J'ai besoin d'aide sur la façon de formater la sortie en C++ pour afficher les décimales s'il y en a, ou afficher l'entier s'il n'y a pas de point décimal montrer.Formatage de la sortie pour les valeurs à virgule flottante juste quand il y a des valeurs fractionnaires en C++

it should show 95.7 // When there is decimal 
it should show 90 // When there is no decimal 

j'ai écrit:

cout << setprecision(1) << fixed; 

Il ne me donne pas le résultat attendu. Au lieu d'imprimer 90, il imprime 90,0

+0

Alors, quel est votre problème? À quelle erreur faites-vous face? –

+0

Simplement 'std :: cout << 95.7 << '' << 90.0 << '\';' affiche par défaut les valeurs que vous avez demandées. N'avez-vous pas vraiment écrit du code et regardé? Si vous avez du code qui ne fonctionne pas, postez-le et montrez-nous le résultat que vous obtenez. –

+0

Quand j'écris: cout << setprecition (1) << fixe. Cela ne me donne pas de résultat attendu. Au lieu d'imprimer 90, il imprime 90.0 – Allen

Répondre

1

En supposant que vous effectuez la division.

  1. En utilisant cout:
    i) Si la partie décimale se révéler .000000, puis en utilisant cout imprimera seulement le nombre entier (le nombre entier) partie.
    ii) Si la partie décimale s'avère être autre chose que .000000, alors cout imprime également la partie décimale.

    Ainsi, dans les deux cas, cout conduira au comportement dont vous avez besoin.

  2. printf()
    à l'aide i) Si la partie décimale se révèle être .000000, puis en utilisant printf() imprimera le nombre entier, suivi de la partie décimale, par exemple, 3.000000. Dans ce cas, vous devrez le gérer manuellement pour que la sortie soit juste 3. Ii) Si la partie décimale n'est pas .000000, alors printf() affichera la sortie comme 3.123456.

Veuillez voir le code ci-dessous. J'utilise le fait que si le reste de la division est 0, alors cela signifie que la partie décimale est .000000 et typecasting les numéros à int avant de les imprimer. Vous devrez peut-être utiliser une approche différente comme indiqué ci-dessus.

#include <iostream> 
#include <cstdio> 
using namespace std; 

int main() { 
    double num1=270.0, num2=90.0; 
    cout<<num1/num2<<"\n";      //prints just 3 
    printf("%f\n", num1/num2);     //prints 3.000000 
    if((int)num1%(int)num2==0)     //means num1 is a multiple of num2. So decimal is .000000 
     printf("%d\n", (int)num1/(int)num2);  

    num2=91.0; 
    cout<<num1/num2<<"\n";      //prints 2.96703 
    printf("%f\n", num1/num2);     //prints 2.967033 
    if((int)num1%(int)num2!=0)     
     printf("%f\n", num1/num2); 
    return 0; 
} 

Démonstration en direct here.

1

Vous pouvez créer une fonction qui convertira le flottant en une seule décimale. Ensuite, testez si le flotteur est égal à sa partie intégrale (c.-à-d. Si 90,0 est égal à 90), imprimez seulement la partie intégrale, sinon imprimez le flotteur.

#include <iostream> 
#include <math.h> 

using namespace std; 

void printFloat(float num) { 

    // convert num to properly rounded decimal with 1 decimal place 
    num = floor(num*10 + .5)/10; 

    // if the float equals the whole number, only show the whole number 
    if (num == (int)num) 
     cout << (int)num << endl; 
    else 
     cout << num << endl; 
} 

int main() { 
    float num1 = 90.0; 
    float num2 = 90; 
    float num3 = 90.00001; 
    float num4 = 95.7; 
    float num5 = 95.74; 
    float num6 = 95.75; 

    printFloat(num1); // prints 90 
    printFloat(num2); // prints 90 
    printFloat(num3); // prints 90 
    printFloat(num4); // prints 95.7 
    printFloat(num5); // prints 95.7 
    printFloat(num6); // prints 95.8 
} 
+1

'if (num == (int) num) cout << (int) num; sinon cout << num; >> est plus court. Pas besoin de soustraire pour obtenir la partie fractionnaire –

+0

Merci @ LưuVĩnhPhúc - J'ai mis à jour ma réponse pour refléter votre suggestion plus efficace. – amallard