Arduino arrotonda allo 0,5 più vicino

Ho un valore doppio, ad esempio: 34,26 o 11,92 o 2,51. Dovrebbe essere arrotondato allo 0,5 più vicino, quindi 1,34 -> 1,50 e 32,78 -> 33 e 21,09 -> 21,00

Come si fa?

Commenti

  • ' d suggerisco di non usare nemmeno i float. 0,5 = 50, 1,34 = 134, 32,78 = 3278, dovrebbe rendere i calcoli più veloci / più efficienti.
  • Inoltre, supponiamo che ' s abbia 134, tu può fare il 134% 50, che restituirà 34 e quindi puoi controllare se ' è superiore a 24 (inferiore = arrotondato a 0) e superiore a 74 (inferiore a 50) e altrimenti arrotondi a 100.

Risposta

È una pessima idea usare float.
Detto ciò. moltiplicare per 2 ed eseguire un giro standard.
Quindi dividere per 2.

Ad esempio:

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

e

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

Commenti

  • La moltiplicazione per 2 è in realtà molto intelligente Mi sembrava già che un modo così semplice dovrebbe esistono.
  • Comunemente utilizzato anche per 0,10 e 0,05 più vicini nei registratori di cassa (utilizzando 10, 20).

Risposta

Ho creato un piccolo algoritmo dalla prima cosa che mi è venuta in mente. Sto usando numeri interi, poiché credo che funzioni meglio come float.

Ad esempio, puoi rappresentare gli euro (con virgola mobile) esprimendoli in centesimi.

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 } 

In realtà penso che lalgoritmo sia un po strano e potrebbe esistere anche qualcosa di più semplice / più efficace. Era solo la prima cosa che mi è venuta in mente.

Risposta

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

puoi usare roundf () come in questo video Video dimostrativo

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *