Arduino arredondado para o próximo 0,5

Estou tendo um valor duplo, por exemplo: 34,26 ou 11,92 ou 2,51. Deve ser arredondado para o 0,5 mais próximo, então 1,34 -> 1,50 e 32,78 -> 33 e 21,09 -> 21,00

Como fazer isso?

Comentários

  • Eu ' d sugiro nem mesmo usar floats. 0,5 = 50, 1,34 = 134, 32,78 = 3278, deve tornar os cálculos mais rápidos / mais eficientes.
  • Além disso, vamos ' s dizer que você tem 134, você pode fazer 134% 50, que retornará 34 e então você pode verificar se ' s acima de 24 (abaixo = arredondado para 0) e acima de 74 (abaixo é arredondado para 50) e caso contrário, você arredondará para 100.

Resposta

É uma ideia muito ruim usar float.
Dito isso. multiplique por 2 e faça uma rodada padrão.
Em seguida, divida novamente por 2.

Por exemplo:

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

e

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

Comentários

  • Multiplicar por 2 é realmente muito inteligente. Já senti que uma maneira tão simples deveria existem.
  • Normalmente usado para os próximos 0,10 e 0,05 em caixas registradoras também (usando 10, 20).

Resposta

Fiz um pequeno algoritmo a partir da primeira coisa que me veio à mente. Estou usando números inteiros, pois acredito que funciona melhor como flutuantes.

Por exemplo, você pode representar euros (com pontos flutuantes) expressando-os em centavos.

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 } 

Na verdade, acho que o algoritmo é um pouco estranho e algo mais simples / eficaz também poderia existir. Foi apenas a primeira coisa que me veio à mente.

Resposta

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

você pode usar roundf () como neste vídeo Vídeo de demonstração

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *