HOWTO · Arduino
Come arrotondare un float all'intero più vicino in Arduino
Scopri come round() di Arduino arrotonda i valori in virgola mobile all'intero più vicino, come si comportano i valori positivi e negativi esattamente a metà e come arrotondare a un numero scelto di cifre decimali.
In questa pagina
Usa la funzione round() di Arduino per ottenere da un float il valore intero più vicino. I valori a metà tra due interi vengono arrotondati allontanandosi da zero: 5.5 diventa 6 e -3.5 diventa -4. Quando è utile avere un valore intero, puoi assegnare il risultato a una variabile int.
Cosa fa round() in Arduino
round() restituisce un valore in virgola mobile che rappresenta l’intero più vicino. Assegnando il risultato a un int, ne memorizzi il valore intero. Per esempio, round(3.6) restituisce 4, mentre round(-2.3) restituisce -2. La funzione modifica il valore usato nei calcoli successivi, ma non cambia la variabile originale, a meno che tu non le assegni il risultato.
Questo programma C++ completo illustra l’arrotondamento all’intero e il ridimensionamento di una misura per ottenere due cifre decimali. Usa la funzione standard C++ round, che segue la stessa regola; in uno sketch Arduino, chiama round() e invia i valori a Serial secondo necessità. L’esempio è autonomo e, quando viene eseguito, stampa risultati accompagnati da etichette.
#include <cmath>
#include <cstdio>
int main() {
float positive = 5.5f;
float belowZero = -3.5f;
float measurement = 7.4567f;
int roundedPositive = static_cast<int>(std::round(positive));
int roundedBelowZero = static_cast<int>(std::round(belowZero));
float roundedMeasurement = std::round(measurement * 100.0f) / 100.0f;
std::printf("positive: %d\n", roundedPositive);
std::printf("below zero: %d\n", roundedBelowZero);
std::printf("measurement: %.2f\n", roundedMeasurement);
return 0;
}
Arrotondare valori positivi e negativi
Per i valori positivi si sceglie l’intero più vicino: i valori inferiori al punto medio vengono arrotondati per difetto, mentre quelli pari o superiori al punto medio vengono arrotondati per eccesso. Quindi 5.4 diventa 5, mentre 5.5 e 5.6 diventano 6. Se il valore è esattamente a metà, il risultato si allontana da zero.
La stessa regola per i valori a metà vale anche per i numeri negativi. Per esempio, -3.4 diventa -3, mentre -3.5 e -3.6 diventano -4. Non si tratta di un arrotondamento bancario: i valori a metà non cambiano direzione per favorire un intero pari. Se assegni il risultato a un int, assicurati che il valore arrotondato rientri nell’intervallo consentito da quel tipo.
Arrotondare a un numero scelto di cifre decimali
Da sola, round() arrotonda a un intero. Per arrotondare un valore a un numero scelto di cifre decimali, moltiplicalo per la corrispondente potenza di dieci, chiama round() e poi dividi per lo stesso fattore. Per due cifre decimali il fattore è 100; per esempio, 7.4567 diventa circa 7.46.
Questo metodo di ridimensionamento è utile in molti calcoli e per visualizzare i valori, ma i valori float sono memorizzati con una precisione binaria finita. Un numero decimale potrebbe non essere rappresentabile esattamente; di conseguenza, un valore vicino al punto medio può comportarsi diversamente da quanto previsto dall’aritmetica decimale ideale. Per i calcoli che richiedono maggiore precisione, conserva il valore originale; se invece ti serve solo un numero fisso di cifre decimali visibili, formatta il valore per la visualizzazione. Il ridimensionamento non rende esatto il valore memorizzato: modifica il risultato arrotondato in base alla precisione disponibile.
Usare i valori arrotondati in uno sketch Arduino
In uno sketch, assegna il risultato quando è utile avere un intero, per esempio per scegliere un indice di array o visualizzare una misura come numero intero. Prima di assegnarlo, verifica che il valore arrotondato rientri nell’intervallo di int. Per visualizzarlo sulla porta seriale, Serial.println(round(sensorValue)); stampa il valore arrotondato. Il programma completo qui sopra è un esempio C++ eseguito sul computer host e non usa hardware Arduino né l’oggetto Serial di Arduino.
Arrotondare prima della mappatura è facoltativo: map() accetta argomenti interi, quindi l’arrotondamento può essere utile se prima vuoi convertire una misura in virgola mobile in un intero, ma non è necessario per ogni operazione di mappatura. Consulta la funzione Arduino map() per informazioni sul suo comportamento con valori interi.