Zaokrąglanie w górę iw dół

Moje arduino mierzy temperaturę i podaje wartości takie jak: 28,58 stopni Celsjusza. Chciałbym to zaokrąglić w górę do jednego miejsca po przecinku. Mógłbym skrócić zmienną o jedną, odcinając „8”, co spowodowałoby stratę 28,5. Jednak to trochę przypomina oszustwo, ponieważ matematycznie nie jest poprawne. Czy ktoś wie, jak zaokrąglić w górę / w dół. Co pokazałoby moją temperaturę jako 28,6.

Potrzebna jest dodatkowa rada. Wysyłam tempature przez Serial do mojego RPi, który ma uruchomiony kod Pythona. Czy zasugerowałbyś zaokrąglenie w kodzie Arduino lub w kodzie Pythona.

Z góry dziękujemy!

Komentarze

  • Nie ' t to be lepiej zaokrąglić do najbliższego niż systematycznie w górę.
  • Tak, chciałbym móc to zaokrąglić w sposób matematyczny. 28,65 <, zmieni się na 28,6 i 28,65 ≥, stanie się 28,7
  • Następnie pozwól Serial.print() zaokrąglić, tak jak za odpowiedź @Jot '.
  • Osobiście nie zaokrągliłbym, dopóki dane nie znajdą się na Pi. Po co tracić precyzję, skoro ' nie trzeba? Co się stanie, jeśli w pewnym momencie zdecydujesz, że musisz wykonać więcej obliczeń na danych na Pi? Python ma wbudowaną funkcję round () .

Odpowiedź

O ile wiem, Serial.print (lub println) zaokrągla w górę iw dół. Wszystko, co musisz zrobić, to wziąć zmienną typu float i wykonać Serial.print( value, 1);

Bez dodatkowego parametru wybierana jest wartość domyślna, czyli 2 cyfry dziesiętne: Serial.print( value, 2);

Dlaczego chcesz skrócić bajty w numerze seryjnym? Równie dobrze możesz wysłać dwie cyfry dziesiętne i przetworzyć wartość w Pythonie.

Komentarze

  • O tym jest ostatnia część mojego pytania; ) zastanawiasz się, gdzie przetworzyć, w pythonie na moim Rpi lub przed wysłaniem.
  • Wszelkie zaokrąglenia powinny być wykonywane jak najbliżej końcowego wyniku. Jeśli twój port szeregowy jest wystarczająco szybki, wyślij 2 lub 3 cyfry i zaokrąglij, gdy Pi wysyła dane. Nie ' nie chcesz opierać obliczeń na zaokrąglonych wartościach, jeśli możesz w tym pomóc, co stwarza możliwość wystąpienia błędów. To powiedziawszy, ' to kompletna strata czasu na wysyłanie liczb losowych. Jeśli czujnik temperatury ma błąd +/- 1 stopień, to pierwsze miejsce dziesiętne może być przydatne, wszystko po tym jest bez znaczenia.
  • OK, zgadzam się! Bardziej precyzyjne przetwarzanie na końcowym etapie, ale nie ma dokładności czujnika, więc zaoszczędzę przepustowość, używając Serial.print (wartość, 1);

Odpowiedź

Możesz zaokrąglić w C, mnożąc istotność, dodając +0,5, zaokrąglając w dół (równa się rzutowaniu na liczbę całkowitą) i dzieląc.

float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0); 

28.6 będzie:

float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6 

W Pythonie jest równe (z wyjątkiem operatora rzutowania int ( …)

Aktualizacja: dla liczb ujemnych +0,5 powinno wynosić -0,5

Kredyty dla Edgara Boneta: użycie okrągłych działa zarówno dla liczb dodatnich, jak i ujemnych:

float f_rounded = round(f * 10) / 10.0; 

Komentarze

  • Zaokrągliłoby to -28.58 do -28.5.
  • @JohnnyMopp Zaktualizowałem moje odpowiedzi, dziękuję za komentarz
  • Dlaczego nie tylko float f_rounded = round(f * 10) / 10.0;? To obsługuje zarówno pozytywne, jak i negatywne przypadki.

Dodaj komentarz

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