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