Arduino kerekít 0,5-ös pontossággal

Kettős értékem van például: 34,26 vagy 11,92 vagy 2,51. 0,5-re kell kerekíteni, így 1,34 -> 1,50 és 32,78 -> 33 és 21,09 -> 21,00

Hogyan kell ezt csinálni?

Megjegyzések

  • Én ' azt javaslom, hogy ne is használjak úszókat. 0,5 = 50, 1,34 = 134, 32,78 = 3278, gyorsabbá / hatékonyabbá kell tennie a számításokat.
  • Mondja azt is, hogy ' mondhatja, hogy 134 van, akkor képes 134% 50-re, ami 34-et ad vissza, és utána ellenőrizheti, hogy ' 24 felett van-e (alatt = 0-ig kerek) és 74-nél (50-ig kerek-e), és egyébként 100-ra kerekít.

Válasz

Nagyon rossz ötlet az úszó használata.
Ezt mondják. szorozzuk meg 2-vel és végezzünk el egy szokásos kört.
Ezután osszuk vissza 2-vel.

Például:

1.34 *2 = 2.68 round(2.68) = 3 3 /2 = 1.5 

és

32.78 *2 = 65.56 round(65.56)= 66 66 /2 = 33 

Megjegyzések

  • A 2-gyel való szorzás valójában nagyon okos. Úgy éreztem, hogy ilyen egyszerű módon létezik.
  • Általában 0,10 és 0,05 pontossággal használják a pénztárgépekben is (10, 20 használatával).

Válasz

Készítettem egy kis algoritmust az első dologból, ami eszembe jutott. Egész számokat használok, mivel úgy gondolom, hogy ez lebegőként jobban működik.

Például reprezentálhatja az eurókat (lebegőpontokkal) centekkel kifejezve.

unsigned int roundToFifty(unsigned int nonRound){ unsigned int rest = nonRound % 50; unsigned int fits = floor(nonRound / 50); unsigned int add = 0; if(rest >= 25){ if(rest >= 75){ add = 100 }else{ add = 50 } } return fits*50+add } 

Valójában szerintem az algoritmus egy kicsit furcsa, és létezhet valami egyszerűbb / hatékonyabb is. Ez csak az első, ami eszembe jutott.

Válasz

float i=1.5237475984328953; #include "math.h" void setup() { Serial.begin(9600); } void loop() { Serial.println(i,6); float price = i*1000; Serial.println(price,2); float roundNearest = roundf(i*1000) ; // x 100 for two decimal place roundNearest = roundNearest/1000; Serial.println(roundNearest,6); price = (roundNearest*1000); Serial.println(price,2); while(1){} } 

használhatja a roundf () elemet, mint ebben a videóban Bemutató videó

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