Arrondir vers le haut et vers le bas

Mon arduino mesure la température et donne des valeurs comme: 28,58 degrés Celsius. Je voudrais arrondir ce chiffre à une décimale. Je pourrais raccourcir la variable en coupant le « 8 » qui désafficherait 28,5. Pourtant, cela ressemble un peu à de la triche car il nest pas mathématiquement correct. Quelquun sait-il arrondir vers le haut / vers le bas. Ce qui montrerait ma température comme 28,6.

Des conseils supplémentaires sont nécessaires. Jenvoie la tempature par Serial à mon RPi qui a un code python en cours dexécution. Suggérez-vous de faire larrondi dans le code Arduino ou dans le code Python.

Merci davance!

Commentaires

  • Ne serait pas ' que ce soit mieux vaut arrondir au le plus proche plutôt que darrondir systématiquement vers le haut.
  • Oui, jaimerais pouvoir larrondir de manière mathématique. 28,65 <, deviendra 28,6 et 28,65 ≥, deviendra 28,7
  • Puis, Serial.print() faire l’arrondi, comme par réponse de @Jot '.
  • Personnellement, je ne arrondirais pas tant que les données ne seraient pas sur le Pi. Pourquoi perdre en précision quand vous n’avez ' pas besoin de le faire? Et si, plus tard, vous décidiez de faire plus de calculs sur les données du Pi? Python a une fonction round () intégrée.

Réponse

Autant que je sache, Serial.print (ou println) arrondit vers le haut et vers le bas. Tout ce que vous avez à faire est de prendre une variable flottante et de faire Serial.print( value, 1);

Sans paramètre supplémentaire, la valeur par défaut est choisie, soit 2 chiffres décimaux: Serial.print( value, 2);

Pourquoi voulez-vous raccourcir les octets sur le Serial? Vous pouvez tout aussi bien envoyer deux chiffres décimaux et traiter la valeur en Python.

Commentaires

  • Cest sur quoi porte la dernière partie de ma question; ) se demandant où traiter, en python sur mon Rpi ou avant lenvoi.
  • Tout arrondi doit être effectué au plus près de la sortie finale. Si votre port série est assez rapide, envoyez 2 ou 3 chiffres et arrondissez lorsque le Pi sort les données. Vous n ' pas vouloir baser les calculs sur des valeurs arrondies si vous pouvez l’aider, ce qui introduit la possibilité d’erreurs. Cela dit, ' est une perte de temps totale à envoyer des nombres aléatoires, si le capteur de température a une erreur de +/- 1 degré, la première décimale peut être utile, tout ce qui suit est sans signification.
  • Daccord, daccord! Il est plus précis de traiter à létape finale, mais la précision du capteur nest pas là, donc je vais économiser de la bande passante en utilisant Serial.print (valeur, 1);

Réponse

Vous pouvez arrondir à C en multipliant la signification, en ajoutant +0,5, en arrondissant vers le bas (équivaut à une conversion en entier) et en divisant.

float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0); 

28,6 sera:

float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6 

En Python, il est égal (sauf que lopérateur de conversion est int ( …)

Mise à jour: pour les nombres négatifs +0,5 devrait être -0,5

Crédits pour Edgar Bonet: en utilisant des rondes pour les nombres positifs et négatifs:

float f_rounded = round(f * 10) / 10.0; 

Commentaires

  • Cela arrondirait -28.58 à -28.5.
  • @JohnnyMopp Jai mis à jour mes réponses, merci pour le commentaire
  • Pourquoi pas simplement float f_rounded = round(f * 10) / 10.0;? les cas positifs et négatifs.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *