Jag har ett dubbelt värde till exempel: 34.26 eller 11.92 eller 2.51. Den ska avrundas till närmaste 0,5 så 1,34 -> 1,50 och 32,78 -> 33 och 21,09 -> 21,00
Hur gör man det?
Kommentarer
- Jag ' d föreslår att du inte ens använder floats. 0,5 = 50, 1,34 = 134, 32,78 = 3278, ska göra beräkningarna snabbare / effektivare.
- Låt också ' säga att du har 134, du kan göra 134% 50, vilket kommer att returnera 34 och sedan kan du kontrollera om det ' över 24 (under = runda till 0) och över 74 (under är runt till 50) och annars avrundas du till 100.
Svar
Det är en väldigt dålig idé att använda float.
Med det sagt. multiplicera med 2 och gör en standardomgång.
Dela sedan tillbaka med 2.
Till exempel:
1.34 *2 = 2.68 round(2.68) = 3 3 /2 = 1.5
och
32.78 *2 = 65.56 round(65.56)= 66 66 /2 = 33
Kommentarer
- Multiplicera med 2 är faktiskt väldigt smart jag kände mig redan som ett så enkelt sätt att existerar.
- Används vanligtvis också för närmaste 0.10 och 0.05 i kassaregister (med 10, 20).
Svar
Jag skapade en liten algoritm från det första som dök upp i mitt sinne. Jag använder heltal eftersom jag tror att det fungerar bättre som flytande.
Du kan till exempel representera euro (med flytande punkter) genom att uttrycka dem i cent.
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 }
Jag tycker faktiskt att algoritmen är lite konstig och något enklare / mer effektivt kan också finnas. Det var bara det första som kom upp i mitt sinne.
Svar
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){} }
du kan använda roundf () som i den här videon Demovideo