Pyöristäminen ylös- ja alaspäin

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

  • Ei ' ei olisi parempi pyöristää lähimpään sen sijaan, että pyöristettäisiin järjestelmällisesti ylöspäin.
  • Kyllä, haluaisin pyöristää sen matemaattisella tavalla. 28,65 <, tulee 28,6 ja 28,65 ≥, tulee 28,7
  • Anna sitten Serial.print() tehdä pyöristys, kuten @Jot ' -vastausta kohti.
  • Henkilökohtaisesti en pyöristä, ennen kuin tiedot ovat Pi: llä. Miksi menetät tarkkuuden, kun et tarvitse ' sitä? Entä jos joskus myöhemmin päätät, että sinun on tehtävä enemmän laskelmia Pi-tiedoista? Pythoniin on sisäänrakennettu round () -toiminto.

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.

  • Okei sopinut! Käsittely viimeisessä vaiheessa on tarkempaa, mutta anturin tarkkuus ei ole vielä olemassa, joten säästän kaistanleveyttä käyttämällä Serial.print-arvoa (arvo, 1);
  • 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.

    Vastaa

    Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *