Minulla on kaksinkertainen arvo, esimerkiksi: 34,26 tai 11,92 tai 2,51. Se tulisi pyöristää lähimpään 0,5: ään, joten 1,34 -> 1,50 ja 32,78 -> 33 ja 21,09 -> 21,00
Kuinka tämä tehdään?
Kommentit
- I ' ehdotan, ettet edes käytä kellukkeita. 0,5 = 50, 1,34 = 134, 32,78 = 3278, pitäisi tehdä laskutoimituksista nopeampia / tehokkaampia.
- Anna ' s sanoa, että sinulla on 134, sinä voi tehdä 134% 50, joka palauttaa arvon 34, ja sitten voit tarkistaa, onko se ' yli 24 (alle = pyöreä 0: een) ja yli 74 (alle on pyöreä 50: een) ja muuten pyöristät 100: een.
Vastaa
On erittäin huono idea käyttää kelluketta.
Näin sanotaan. kerro 2: lla ja tee vakiokierros.
Jaa sitten takaisin 2: lla.
Esimerkiksi:
1.34 *2 = 2.68 round(2.68) = 3 3 /2 = 1.5
ja
32.78 *2 = 65.56 round(65.56)= 66 66 /2 = 33
Kommentit
- Kertominen 2: lla on itse asiassa hyvin fiksu. Minusta tuntui jo, että tällaisen yksinkertaisen tavan pitäisi olemassa.
- Käytetään yleisesti myös lähinnä 0,10 ja 0,05 kassakoneissa (käyttäen 10, 20).
Vastaa
Tein pienen algoritmin ensimmäisestä, joka tuli mieleeni. Käytän kokonaislukuja, koska uskon, että se toimii paremmin kellukkeina.
Voit esimerkiksi edustaa euroja (liukulukuilla) ilmaisemalla ne sentteinä.
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 }
Luulen, että algoritmi on todella outo ja voisi olla olemassa myös jotain yksinkertaisempaa / tehokkaampaa. Se oli vain ensimmäinen asia, joka tuli mieleeni.
Vastaa
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){} }
voit käyttää roundf (): ta, kuten tässä videossa. Esittelyvideo