Arduino zaokrąglij do najbliższej 0,5

Mam podwójną wartość, na przykład: 34,26 lub 11,92 lub 2,51. Należy go zaokrąglić do najbliższego 0,5, czyli 1,34 -> 1,50 i 32,78 -> 33 i 21,09 -> 21,00

Jak to zrobić?

Komentarze

  • Ja ' nie sugeruję nawet używania liczb zmiennoprzecinkowych. 0,5 = 50, 1,34 = 134, 32,78 = 3278, powinno przyspieszyć / zwiększyć wydajność obliczeń.
  • Niech ' powie, że masz 134, może zrobić 134% 50, co zwróci 34, a następnie możesz sprawdzić, czy ' s powyżej 24 (under = round to 0) i powyżej 74 (under to round to 50) i w przeciwnym razie zaokrąglij do 100.

Odpowiedź

Używanie float jest bardzo złym pomysłem.
Biorąc to pod uwagę. pomnóż przez 2 i wykonaj standardową rundę.
Następnie podziel z powrotem przez 2.

Na przykład:

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

i

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

Komentarze

  • Mnożenie przez 2 jest w rzeczywistości bardzo sprytne. Już czułem, że taki prosty sposób powinien istnieją.
  • Powszechnie używane dla najbliższych 0,10 i 0,05 również w kasach (przy użyciu 10, 20).

Odpowiedź

Z pierwszej rzeczy, która przyszła mi do głowy, stworzyłem mały algorytm. Używam liczb całkowitych, ponieważ uważam, że działa lepiej jako liczby zmiennoprzecinkowe.

Na przykład możesz przedstawić euro (za pomocą punktów zmiennoprzecinkowych), wyrażając je w centach.

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 } 

Właściwie myślę, że algorytm jest odrobinę dziwny i może też istnieć coś prostszego / bardziej efektywnego. To była pierwsza rzecz, która przyszła mi do głowy.

Odpowiedź

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

możesz użyć roundf () jak w tym filmie Film demonstracyjny

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *