Arduino rond af op 0,5

Ik heb een dubbele waarde, bijvoorbeeld: 34,26 of 11,92 of 2,51. Het moet worden afgerond op de dichtstbijzijnde 0,5, dus 1,34 -> 1,50 en 32,78 -> 33 en 21,09 -> 21,00

Hoe doe je dit?

Opmerkingen

  • Ik ' stel voor om zelfs geen drijvers te gebruiken. 0.5 = 50, 1.34 = 134, 32.78 = 3278, zou de berekeningen sneller / efficiënter moeten maken.
  • Laat ' s zeggen dat je 134 hebt, jij kan 134% 50 doen, wat 34 retourneert en dan kun je controleren of het ' hoger is dan 24 (onder = rond op 0) en hoger dan 74 (onder is rond op 50) en anders rond je af op 100.

Answer

Het is een heel slecht idee om float te gebruiken.
Dat gezegd hebbende. vermenigvuldig met 2 en voer een standaardronde uit.
Deel vervolgens terug door 2.

Bijvoorbeeld:

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

en

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

Reacties

  • Het vermenigvuldigen met 2 is eigenlijk heel slim Ik had al het gevoel dat zon eenvoudige manier zou moeten bestaan.
  • Wordt ook vaak gebruikt voor de dichtstbijzijnde 0.10 en 0.05 in kassas (met 10, 20).

Answer

Ik heb een klein algoritme gemaakt van het eerste dat in me opkwam. Ik gebruik gehele getallen, omdat ik geloof dat het beter werkt als drijvers.

U kunt bijvoorbeeld euros weergeven (met drijvende kommas) door ze in centen uit te drukken.

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 } 

Ik denk eigenlijk dat het algoritme een beetje raar is en dat er ook iets eenvoudiger / effectiever zou kunnen bestaan. Het was gewoon het eerste dat in me opkwam.

Antwoord

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){} } 

je kunt roundf () gebruiken zoals in deze video Demovideo

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *