Kerekítés felfelé és lefelé

Az arduino-m enyhíti a hőmérsékletet és olyan értékeket ad, mint: 28,58 Celsius fok. Szeretném ezt egy tizedesjegyig kerekíteni. Rövidebbé tehetném a változót a “8” levágásával, ami a 28.5-öt tönkretenné. Mégis ez kicsit csalásnak tűnik, mivel matematikai szempontból nem helyes. Tudja valaki, hogyan kell felfelé / lefelé kerekíteni. Ami a tempomat 28,6-nak mutatja.

További tanácsokra van szükség. Sorozaton keresztül küldöm a tempature-t az RPi-mre, amelynek python kódja fut. Javasolnád a kerekítést az Arduino vagy a Python kódban.

Előre is köszönöm!

Megjegyzések

  • Nem lenne ' jobb, ha a legközelebbi -re kerekít, nem pedig szisztematikusan felfelé.
  • Igen, nagyon szeretném, ha matematikai módon kerekítenék. 28,65 <, 28,6 és 28,65 ≥, 28,7 lesz
  • Ezután engedje meg a Serial.print() kerekítést, ahogy a @Jot ' válaszok szerint.
  • Személy szerint én nem kerekítenék, amíg az adatok nem lesznek a Pi-n. Miért veszítené el a pontosságot, ha nem szükséges '? Mi van, ha valamikor később úgy dönt, hogy több számítást kell végeznie a Pi adatain? A Python round () funkcióval rendelkezik.

Válasz

Ha jól tudom, a Serial.print (vagy println) felfelé és lefelé kerekít. Csak annyit kell tennie, hogy vegyen egy úszó változót, és tegye a következőt: Serial.print( value, 1);

Extra paraméter nélkül az alapértelmezett érték kerül kiválasztásra, amely két tizedesjegyű: Serial.print( value, 2);

Miért szeretné lerövidíteni a bájtokat a Sorozat felett? Ugyanúgy elküldhet két tizedesjegyet, és feldolgozhatja az értéket a Pythonban.

Megjegyzések

  • Ez az, amiről a kérdésem utolsó része szól; ), hogy vajon hol kell feldolgozni, Python-ban az Rpi-n vagy küldés előtt.
  • Bármilyen kerekítést a lehető legközelebb kell végezni a végső kimenethez. Ha a soros portja elég gyors, akkor küldjön 2 vagy 3 számjegyet, és kerekítse, amikor a Pi kiírja az adatokat. Ha nem tudsz segíteni, akkor <

nem akarsz lekerekített értékekre alapozni a számításokat, ami bevezeti a hibák lehetőségét. Ez azt jelenti, hogy ' teljes időpazarlás véletlenszerű számok küldésével, ha a hőmérséklet-érzékelő hibája +/- 1 fok, akkor az első tizedesjegy hasznos lehet, bármi ezután értelmetlen.

  • Rendben egyetértett! Pontosabban feldolgozható az utolsó szakaszban, mégsem érhető el az érzékelő pontossága, ezért a Serial.print (érték, 1) használatával spórolom a sávszélességet;
  • Válasz

    C-ben kerekíthet a szignifikancia szorzásával, +0,5 összeadásával, lefelé kerekítéssel (egyenlő egész számra való öntéssel) és osztással. div id = “cda7d39974″>

    A 28.6 lesz:

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

    A Pythonban ez egyenlő (kivéve, ha a cast operátor int ( …)

    Frissítés: negatív számok esetén a +0,5 értéke -0,5 legyen.

    Kreditek Edgar Bonet számára: kerek művek használata pozitív és negatív számokhoz egyaránt:

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

    Megjegyzések

    • Ez -28.58 -et kerekítené -28.5.
    • @JohnnyMopp frissítette a válaszaimat, köszönöm a megjegyzést
    • Miért nem csak float f_rounded = round(f * 10) / 10.0;? Ez kezeli a pozitív és a negatív eseteket egyaránt.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük