Arduino zaokrouhleno na nejbližší 0,5

Mám například dvojnásobnou hodnotu: 34,26 nebo 11,92 nebo 2,51. Mělo by být zaokrouhleno na nejbližší 0,5, takže 1,34 -> 1,50 a 32,78 -> 33 a 21,09 -> 21,00

Jak na to?

Komentáře

  • Navrhuji, aby se floaty nepoužívaly ani '. 0,5 = 50, 1,34 = 134, 32,78 = 3278, by měly výpočty zrychlit / zefektivnit.
  • Také řekněme ' s, že máte 134, vy může udělat 134% 50, což vrátí 34 a pak můžete zkontrolovat, zda je to ' s nad 24 (under = zaokrouhleno na 0) a nad 74 (pod je zaokrouhleno na 50) a jinak zaokrouhlíte na 100.

Odpověď

Je velmi špatný nápad použít float.
To bylo řečeno. vynásobte 2 a proveďte standardní kolo.
Potom vydělte zpět 2.

Například:

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

a

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

Komentáře

  • Násobení 2 je ve skutečnosti velmi chytré. Už jsem měl pocit, že takový jednoduchý způsob by měl být existují.
  • Běžně se používá také pro nejbližší 0,10 a 0,05 v pokladnách (10, 20).

Odpověď

Udělal jsem malý algoritmus z první věci, která se mi objevila v mysli. Používám celá čísla, protože věřím, že to funguje lépe jako plováky.

Například můžete vyjádřit eura (s plovoucími čárkami) vyjádřením v centech.

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 } 

Vlastně si myslím, že algoritmus je trochu divný a že by mohlo existovat i něco jednoduššího / účinnějšího. Byla to jen první věc, která mi napadla.

Odpověď

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){} } 

můžete použít roundf () jako v tomto videu Demo Video

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *