Arduino runde til nærmeste 0,5 (Norsk)

Jeg har en dobbel verdi for eksempel: 34.26 eller 11.92 eller 2.51. Den skal avrundes til nærmeste 0,5, så 1,34 -> 1,50 og 32,78 -> 33 og 21,09 -> 21,00

Hvordan gjør jeg dette?

Kommentarer

  • Jeg ' Jeg foreslår at du ikke engang bruker flottører. 0,5 = 50, 1,34 = 134, 32,78 = 3278, skal gjøre beregningene raskere / mer effektive.
  • La også ' si at du har 134, du kan gjøre 134% 50, som vil returnere 34, og så kan du sjekke om det ' er over 24 (under = runde til 0) og over 74 (under er rundt til 50) og ellers runder du til 100.

Svar

Det er en veldig dårlig idé å bruke float.
Når det er sagt. multipliser med 2 og gjør en standard runde.
Del deretter tilbake med 2.

For eksempel:

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

og

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

Kommentarer

  • Multipliser med 2 er faktisk veldig smart jeg allerede følte at en så enkel måte burde eksisterer.
  • Brukes ofte også for nærmeste 0,10 og 0,05 i kassaapparater (bruker 10, 20).

Svar

Jeg lagde en liten algoritme fra det første som dukket opp i tankene mine. Jeg bruker heltall, siden jeg tror det fungerer bedre som flyter.

For eksempel kan du representere euro «(med flytende poeng) ved å uttrykke dem i øre.

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 } 

Jeg synes faktisk algoritmen er litt rar og noe enklere / mer effektivt kan også eksistere. Det var bare det første som dukket opp i tankene mine.

Svar

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

du kan bruke roundf () som i denne videoen Demovideo

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *