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.