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
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.
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.
Serial.print()
kerekítést, ahogy a @Jot ' válaszok szerint.