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
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.
Serial.print()
zaokrąglić, tak jak za odpowiedź @Jot '.