Arduino auf 0,5

runden Ich habe einen doppelten Wert, zum Beispiel: 34,26 oder 11,92 oder 2,51. Es sollte auf 0,5 gerundet werden, also 1,34 -> 1,50 und 32,78 -> 33 und 21,09 -> 21,00

Wie geht das?

Kommentare

  • Ich ' würde vorschlagen, nicht einmal Floats zu verwenden. 0,5 = 50, 1,34 = 134, 32,78 = 3278 sollten die Berechnungen schneller / effizienter machen.
  • Lassen Sie uns auch ' sagen, Sie haben 134, Sie kann 134% 50 ausführen, was 34 zurückgibt, und dann können Sie überprüfen, ob ' über 24 (unter = auf 0 runden) und über 74 (unter ist auf 50 gerundet) und liegt Andernfalls runden Sie auf 100.

Antwort

Es ist eine sehr schlechte Idee, float zu verwenden.
Davon abgesehen. multiplizieren Sie mit 2 und machen Sie eine Standardrunde.
Teilen Sie dann durch 2.

Zum Beispiel:

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

und

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

Kommentare

  • Das Multiplizieren mit 2 ist eigentlich sehr klug. Ich hatte bereits das Gefühl, dass dies so einfach sein sollte vorhanden.
  • Wird häufig auch für die nächsten 0,10 und 0,05 in Registrierkassen verwendet (unter Verwendung von 10, 20).

Antwort

Ich habe von Anfang an einen kleinen Algorithmus erstellt, der mir in den Sinn kam. Ich verwende Ganzzahlen, da ich glaube, dass es als Float besser funktioniert.

Sie können beispielsweise Euro (mit Gleitkommawerten) darstellen, indem Sie sie in Cent ausdrücken.

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 } 

Ich denke tatsächlich, der Algorithmus ist ein bisschen komisch und es könnte auch etwas Einfacheres / Effektiveres geben. Es war nur das erste, was mir in den Sinn kam.

Antwort

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

Sie können roundf () wie in diesem Video verwenden. Demo-Video

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.