Arduinoni pitää mielessä lämpötilaa ja antaa arvot, kuten: 28,58 astetta celsiusta. Haluaisin pyöristää tämän yhden desimaalin tarkkuudella. Voisin tehdä muuttujan lyhyemmäksi leikkaamalla ”8” pois, mikä kuvastaa 28.5. Silti tämä tuntuu vähän kuin huijata, koska se ei ole matemaattinen. Tietääkö kukaan kuinka pyöristää ylös / alas. Mikä osoittaisi minun lämpötilan olevan 28,6.
Tarvitaan lisäneuvoja. Lähetän tempmat Serialilla RPi: lle, jolla on python-koodi käynnissä. Voisitko ehdottaa pyöristämistä Arduino-koodissa tai Python-koodissa.
Kiitos etukäteen!
Kommentit
Vastaa
Sikäli kuin tiedän, Serial.print (tai println) pyöristyy ylös ja alas. Sinun tarvitsee vain ottaa float-muuttuja ja tehdä Serial.print( value, 1);
Ilman ylimääräistä parametria valitaan oletusarvo, joka on 2 desimaalilukua: Serial.print( value, 2);
Miksi haluat lyhentää tavua sarjakuvan yli? Voit yhtä hyvin lähettää kaksi desimaalilukua ja käsitellä arvoa Pythonissa.
Kommentit
- Se mitä kysymykseni viimeinen osa koskee; ) ihmettelevät, mihin prosessoida, pythonissa Rpi: llä tai ennen lähettämistä.
- Kaikki pyöristykset tulisi tehdä mahdollisimman lähellä lopullista lähtöä. Jos sarjaporttisi on tarpeeksi nopea, lähetä 2 tai 3 numeroa ja pyöritä, kun Pi luovuttaa tietoja. <
et halua perustaa laskelmia pyöristettyihin arvoihin, jos voit auttaa sitä, mikä tuo mahdollisuuden virheisiin. Tämän vuoksi ' on täydellinen ajanhukkaa satunnaislukujen lähettämisessä, jos lämpötila-anturin virhe on +/- 1 astetta, ensimmäinen desimaali voi olla hyödyllinen, mitä tahansa sen jälkeen on merkityksetön.
Vastaa
Voit pyöristää kirjaimessa C kertomalla merkitsevyyden, lisäämällä +0,5, pyöristämällä alaspäin (yhtä kuin kokonaislukuna heittäminen) ja jakamalla.
float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0);
28.6 tulee olemaan:
float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6
Pythonissa se on yhtä suuri (paitsi että operaattori on int ( …)
Päivitys: negatiivisten numeroiden +0,5: n tulisi olla -0,5
Laajuus Edgar Bonetille: pyöreiden teosten käyttö sekä positiivisille että negatiivisille numeroille:
float f_rounded = round(f * 10) / 10.0;
Kommentit
- Tämä pyöristää
-28.58
muotoon-28.5
. - @JohnnyMopp päivitti vastaukseni, kiitos kommentista.
- Miksi et vain
float f_rounded = round(f * 10) / 10.0;
? Tämä käsittelee sekä positiiviset että negatiiviset tapaukset.
Serial.print()
tehdä pyöristys, kuten @Jot ' -vastausta kohti.