HOWTO · Arduino
Como arredondar um float para o inteiro mais próximo no Arduino
Saiba como o round() do Arduino arredonda valores de ponto flutuante para o inteiro mais próximo, como se comportam os valores positivos e negativos exatamente no meio do caminho e como arredondar para um número escolhido de casas decimais.
Nesta página
Use a função round() do Arduino para obter o número inteiro mais próximo de um valor float. Valores exatamente no meio entre dois inteiros são arredondados para longe de zero: 5.5 se torna 6 e -3.5 se torna -4. Quando for útil trabalhar com um número inteiro, o resultado pode ser armazenado em um int.
O que round() faz no Arduino
round() retorna um valor de ponto flutuante correspondente ao inteiro mais próximo. Ao atribuir esse resultado a um int, o valor inteiro é armazenado. Por exemplo, round(3.6) produz 4, enquanto round(-2.3) produz -2. A função altera o valor usado nos cálculos seguintes; ela não modifica a variável original, a menos que você atribua o resultado a ela.
Este programa C++ completo demonstra o arredondamento para inteiros e o uso de escala para arredondar uma medida para duas casas decimais. Ele usa a função round da biblioteca padrão do C++, que segue a mesma regra. Em um sketch do Arduino, chame round() e envie os valores para Serial conforme necessário. O exemplo é independente e, quando executado, imprime resultados rotulados.
#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;
}
Arredondar valores positivos e negativos
Para valores positivos, seleciona-se o inteiro mais próximo: valores abaixo do ponto médio são arredondados para baixo, e valores iguais ou acima dele são arredondados para cima. Assim, 5.4 se torna 5, enquanto 5.5 e 5.6 se tornam 6. Quando o valor está exatamente no meio, o resultado é arredondado para longe de zero.
A mesma regra para valores exatamente no meio se aplica aos valores negativos. Por exemplo, -3.4 se torna -3, enquanto -3.5 e -3.6 se tornam -4. Esse não é o arredondamento bancário: valores no meio não mudam de direção para favorecer um inteiro par. Se o resultado for atribuído a um int, escolha valores de entrada cujo resultado arredondado caiba no intervalo desse tipo.
Arredondar para um número escolhido de casas decimais
Por si só, round() arredonda para um inteiro. Para arredondar um valor para um número escolhido de casas decimais, multiplique-o pela potência de dez correspondente, chame round() e depois divida pelo mesmo fator. Para duas casas decimais, o fator é 100; por exemplo, 7.4567 se torna aproximadamente 7.46.
Esse método de escala atende a muitas necessidades de exibição e cálculo, mas valores float são armazenados com precisão binária finita. Um valor decimal pode não ser representado exatamente; por isso, um valor próximo do ponto médio pode se comportar de modo diferente do que ocorreria na aritmética decimal ideal. Mantenha o valor original nos cálculos que exigem mais precisão e formate-o para exibição quando precisar apenas de um número fixo de casas decimais visíveis. A escala também não torna o valor armazenado exato: ela altera o resultado arredondado de acordo com a precisão disponível.
Usar valores arredondados em um sketch do Arduino
Em um sketch, atribua o resultado quando um inteiro for útil, por exemplo, ao escolher um índice de array ou exibir uma leitura como número inteiro. Antes de atribuí-lo, verifique se o valor arredondado cabe no intervalo de int. Para exibir o resultado pela porta serial, Serial.println(round(sensorValue)); imprime o valor arredondado. O programa completo acima é uma demonstração em C++ executada no computador; ele não usa hardware Arduino nem o objeto Serial do Arduino.
Arredondar antes de mapear é opcional: map() aceita argumentos inteiros, então o arredondamento pode ajudar ao converter primeiro uma leitura de ponto flutuante em um inteiro, mas não é necessário em toda tarefa de mapeamento. Consulte a função map() do Arduino para entender como ela mapeia valores inteiros.