Arduino runde til nærmeste 0,5

Jeg har en dobbelt værdi for eksempel: 34.26 eller 11.92 eller 2.51. Den skal afrundes til nærmeste 0,5, så 1.34 -> 1.50 og 32.78 -> 33 og 21.09 -> 21.00

Hvordan gør man det?

Kommentarer

  • Jeg ' d foreslår ikke engang at bruge floats. 0,5 = 50, 1,34 = 134, 32,78 = 3278, skal gøre beregningerne hurtigere / mere effektive.
  • Lad også ' sige, at du har 134, du kan gøre 134% 50, hvilket returnerer 34, og så kan du kontrollere, 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 meget dårlig idé at bruge float.
Når det er sagt. gang med 2 og lav en standardrunde.
Del derefter tilbage 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

  • Multiplikationen med 2 er faktisk meget smart, jeg har allerede haft det som en så enkel måde findes.
  • Også almindeligt brugt til nærmeste 0,10 og 0,05 i kasseapparater (ved hjælp af 10, 20).

Svar

Jeg lavede en lille algoritme fra det første, der dukkede op i mit sind. Jeg bruger heltal, da jeg mener, at det fungerer bedre som flydende.

For eksempel kan du repræsentere euro (s med flydende punkter) ved at udtrykke dem i cent.

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, at algoritmen er en smule underlig, og noget enklere / mere effektivt kunne også eksistere. Det var bare det første, der kom ind i mit sind.

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 bruge roundf () som i denne video Demovideo

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *