Arduino rotund la cel mai apropiat 0,5

Am o valoare dublă, de exemplu: 34,26 sau 11,92 sau 2,51. Ar trebui rotunjit la cel mai apropiat 0,5 deci 1,34 -> 1,50 și 32,78 -> 33 și 21,09 -> 21,00

Cum se face acest lucru?

Comentarii

  • Eu ' sugerez să nu folosesc nici măcar floats. 0,5 = 50, 1,34 = 134, 32,78 = 3278, ar trebui să facă calculele mai rapide / mai eficiente.
  • De asemenea, lăsați ' să spuneți că aveți 134, tu poate face 134% 50, care va returna 34 și apoi puteți verifica dacă ' este mai mare de 24 (sub = rotund la 0) și peste 74 (sub este rotund la 50) și altfel, rotunjiți la 100.

Răspuns

Este o idee foarte proastă să folosiți float.
Acestea fiind spuse. înmulțiți cu 2 și faceți o rundă standard.
Apoi împărțiți înapoi la 2.

De exemplu:

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

și

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

Comentarii

  • Înmulțirea cu 2 este de fapt foarte inteligentă, deja am simțit că un mod atât de simplu ar trebui există.
  • Utilizat în mod obișnuit pentru cele mai apropiate 0,10 și 0,05 și în casele de marcat (folosind 10, 20).

Răspuns

Am făcut un mic algoritm din primul lucru care mi-a apărut în minte. Folosesc numere întregi, deoarece cred că funcționează mai bine ca flotante.

De exemplu, puteți reprezenta euro (cu virgulă mobilă) exprimându-le în cenți.

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 } 

De fapt, cred că algoritmul este un pic ciudat și ar putea exista și ceva mai simplu / mai eficient. A fost doar primul lucru care mi-a apărut în minte.

Răspuns

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

puteți folosi roundf () ca în acest videoclip Video demonstrativ

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *