Arduino arrondi au 0,5 le plus proche

Jai une valeur double par exemple: 34,26 ou 11,92 ou 2,51. Il doit être arrondi au 0,5 le plus proche donc 1,34 -> 1,50 et 32,78 -> 33 et 21,09 -> 21,00

Comment faire cela?

Commentaires

  • Je ' d suggère de ne même pas utiliser de flottants. 0.5 = 50, 1.34 = 134, 32.78 = 3278, devrait rendre les calculs plus rapides / plus efficaces.
  • Aussi, laissez ' dire que vous avez 134, vous peut faire 134% 50, ce qui renverra 34 et ensuite vous pouvez vérifier si ' est supérieur à 24 (sous = arrondi à 0) et supérieur à 74 (inférieur est arrondi à 50) sinon vous arrondissez à 100.

Réponse

Cest une très mauvaise idée dutiliser float.
Cela étant dit. multipliez par 2 et faites un tour standard.
Ensuite, divisez par 2.

Par exemple:

1.34 *2 = 2.68 round(2.68) = 3 3 /2 = 1.5 

et

32.78 *2 = 65.56 round(65.56)= 66 66 /2 = 33 

Commentaires

  • La multiplication par 2 est en fait très intelligente, je me sentais déjà comme une manière aussi simple devrait existent.
  • Couramment utilisé pour les 0,10 et 0,05 les plus proches dans les caisses enregistreuses également (en utilisant 10, 20).

Réponse

Jai créé un petit algorithme à partir de la première chose qui mest venue à lesprit. Jutilise des entiers, car je pense que cela fonctionne mieux en tant que flottants.

Par exemple, vous pouvez représenter les euros (avec des virgules flottantes) en les exprimant en cents.

unsigned int roundToFifty(unsigned int nonRound){ unsigned int rest = nonRound % 50; unsigned int fits = floor(nonRound / 50); unsigned int add = 0; if(rest >= 25){ if(rest >= 75){ add = 100 }else{ add = 50 } } return fits*50+add } 

En fait, je pense que lalgorithme est un peu bizarre et que quelque chose de plus simple / plus efficace pourrait également exister. Cétait juste la première chose qui mest venue à lesprit.

Réponse

float i=1.5237475984328953; #include "math.h" void setup() { Serial.begin(9600); } void loop() { Serial.println(i,6); float price = i*1000; Serial.println(price,2); float roundNearest = roundf(i*1000) ; // x 100 for two decimal place roundNearest = roundNearest/1000; Serial.println(roundNearest,6); price = (roundNearest*1000); Serial.println(price,2); while(1){} } 

vous pouvez utiliser roundf () comme dans cette vidéo Vidéo de démonstration

Laisser un commentaire

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