11
votes

Comment tronquer un numéro de point flottant après un certain nombre de décimales (pas d'arrondi)?

J'essaie d'imprimer le numéro 684.545007 avec une précision de 2 points dans le sens où le numéro est tronqué (non arrondi) après 684.54 .

Quand j'utilise xxx

it sortie 684.55 , mais ce que je voudrais obtenir est 684.54 .

Est-ce que quelqu'un sait comment puis-je corriger cela?


6 commentaires

Si vous attendiez 684.54 , vous vous attendiez, vous vous attendiez au mauvais résultat. C'est si simple.


Parce que je ne veux pas d'une valeur arrondie. Ce code fait partie d'une solution de code de juge en ligne de programmation.


Encore une fois: l'arrondi ne fonctionne pas comme si vous le souhaitez apparemment. Sélectionnez ISN 't cassé .


@Jackmaney, bien sûr non, le nombre est 684.545 et non 684.555. La sortie devrait être .54 pas 0,55


Il semble que vous ayez une mauvaise image de ce que signifie "précision".


Une autre façon de la mettre: ni 684.54 ni 684.55 est exactement égale à 684.545007, mais 684.55 est plus proche de celle-ci, c'est ce que vous obtenez.


3 Réponses :


25
votes

Ce que vous cherchez est troncature em>. Cela devrait fonctionner (au moins pour des chiffres qui ne sont pas terriblement volumineux): xxx pré>

la conversion en entiers tronque la partie fractionnée. P>

in c ++ 11 ou C99 , vous pouvez utiliser la fonction dédiée Trunc code> à cet effet (de L'en-tête code> ou code>. Ceci évitera la restriction à des valeurs qui s'adaptent à un type intégré. P>

std::trunc(100 * var) / 100     // no need for casts


2 commentaires

Si vous avez une bibliothèque standard C99, vous pouvez utiliser trunc () , qui fonctionnera pour une gamme de numéros beaucoup plus grande.


@CAF: Merci, j'ai ajouté ça. Je me demande si quelqu'un suggère Lrint () pour la première solution.



1
votes
printf("%.2f\n", var - 0.005);

1 commentaires

Étant donné que .005 n'est pas représentable exactement, cela est tenu de produire le problème incorrect pour quelques valeurs.



2
votes

Voici mon approche. Il semble moche mais travaille dans la plupart des cas par ex. Var peut être plus grand puis int, peut être zéro ou bizarre '-0'. Il ne gère pas les infinités et les nans cependant.

double var = 684.545007; // or whatever
double var_trunc = var>=0. ? floor(var*100.)/100. : ceil(var*100.)/100.;
printf ("%g\n", var_trunc);


0 commentaires