2010-10-17 7 views
1

J'ai un nombre flottant en C++ et le nombre peut être sous différentes formes, par ex. 355.5 ou 9.9 (c'est l'entrée du code de test).Arrondir des nombres à virgule flottante en C++ à une décimale

J'ai une fonction qui est

float return_max(angle_set_t *angles) 
{ 
    float val; 
    float max; 
    max= angles->key; 
    while(angles != NULL) 
    { 
     val= angles->key; 
     if(max<=val) 
     { 
      max=val; 
     } 
     angles = angles->right; 
    }  
    return max; 
} 

max peut être une valeur flottante. Je veux arrondir la valeur à une décimale.

je besoin d'une solution générale il travaille pour 355,555555 et 9,999999

float first_aset() 
{ 
    //do somethig 
    result=return_max(); 
    return result; 
} 

void main() 
{ 
    if(first_aset(S, 357.0, 20.0) != 9.9 || 
     first_aset(T, 357.0, 20.0) != 9.9) 
    { 
     printf("Error in wrap-around interval (3)\n"); 
     printf(" first in interval [357, 20) in S is %f, should be 9.9\n", 
     first_aset(S, 357.0, 20.0)); 
     printf(" first in interval [357, 20) in T is %f, should be 9.9\n", 
     first_aset(T, 357.0, 20.0)); 
    } 
} 

ici est le résultat problem..the est:

erreur dans wrap-around intervalle (3)

première dans l'intervalle [357, 20) en S est 9,900000, devrait être 9,9

première dans l'intervalle [357, 20) en T est 9 0,900000, devrait être 9,9

+0

Avez-vous besoin d'arrondir la valeur à afficher à l'utilisateur, ou allez-vous effectuer d'autres calculs qui nécessitent que la valeur soit arrondie? Avez-vous une stratégie d'arrondi spécifique à l'esprit? (Il y a plus d'une façon d'arrondir un nombre.) –

+0

calculs supplémentaires – abbas

+0

Pourquoi pensez-vous que l'arrondi est une bonne idée ici? Quelle est la signification de "un chiffre décimal" dans ce cas? Pourquoi ne pas simplement vivre avec la précision supplémentaire et être heureux à ce sujet? – fredoverflow

Répondre

5

Do

answer = static_cast<float>(static_cast<int>(number * 10.))/10.; 

Si au contraire, vous essayez juste d'afficher la valeur avec cette précision, essayez setprecision:

cout << setprecision(1) << number << endl; 

Dans votre code, vous êtes comparer un flotteur à un double. Cela ne peut que mal se terminer (comme le feront toutes les comparaisons à virgule flottante). Il peut (rarement) travailler si vous comparez à 9.9f

+0

Cela fonctionnera certainement bien pour tout nombre <= 360. Cependant, techniquement, ce n'est pas une "solution générale" car la partie 'number * 10 'introduirait sa propre erreur d'arrondi lorsqu'elle est appliquée à de très grands flottants (puisque 10 n'est pas une puissance de 2). – AlcubierreDrive

+0

mais j'en ai besoin pour les flotteurs non doublés. – abbas

+0

@abbas Un double est un flotteur avec plus de capacité de stockage. – AlcubierreDrive

4
rounded = truncf(original * 10)/10; 

Cependant, je suis d'accord avec Ben que vous devriez certainement pas être la vérification de l'inégalité exacte. Utilisez un epsilon si une comparaison est nécessaire.

+0

Divisez-le par 10, aussi. Et ce sera tronqué plutôt que rond ... dépend si c'est ce qu'il veut. – JoshD

+0

sera-t-il diviser par dix pour tous les nombres 355.55555 ainsi que 9.9999999 – abbas

+0

@Josh, il est assez clair de l'exemple qu'il veut tronquer. –

0

Comme une note de côté, vous semblez construire votre propre liste chaînée (intrusive). C++ fournit déjà divers conteneurs pour vous, tels que vector et list. En outre, vous n'avez pas besoin d'écrire une fonction qui détermine la valeur maximale dans une séquence, utilisez simplement un algorithme approprié de la bibliothèque standard.

#include <vector> 
#include <algorithm> 

std::vector<float> angles = {0.0, 355.5, 9.9}; 
float maximum = *std::maximum_element(angles.begin(), angles.end()); 
Questions connexes