Округлить до ближайших 0,5

У меня есть двойное значение, например: 34,26, 11,92 или 2,51. Его следует округлить до ближайшего 0,5, поэтому 1,34 -> 1,50 и 32,78 -> 33 и 21,09 -> 21,00

Как это сделать?

, 👍1

Обсуждение

Я бы предложил даже не использовать поплавки. 0,5 = 50, 1,34 = 134, 32,78 = 3278 должны сделать вычисления быстрее/эффективнее., @Paul

Кроме того, допустим, у вас есть 134, вы можете сделать 134%50, что вернет 34, а затем вы можете проверить, больше ли оно 24 (меньше = округлить до 0) и больше 74 (меньше округлить до 50), а иначе вы округлите до 100., @Paul


3 ответа


Лучший ответ:

7

Очень плохая идея использовать float.
Что, как говорится. умножьте на 2 и сделайте стандартный раунд.
Затем разделите обратно на 2.

Например:

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

и

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

Умножение на 2 на самом деле очень умно, я уже чувствовал, что такой простой способ должен существовать., @Paul

Также обычно используется для ближайших 0,10 и 0,05 в кассовых аппаратах (используя 10, 20)., @mckenzm


0

Я составил небольшой алгоритм из первого, что пришло мне в голову. Я использую целые числа, так как считаю, что они лучше работают с числами с плавающей запятой.

Например, вы можете представить евро (с плавающей запятой), выразив их в центах.

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
}

Я на самом деле думаю, что алгоритм немного странный, и что также может существовать что-то более простое/более эффективное. Это было первое, что пришло мне в голову.

,

0
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 для двух знаков после запятой
  roundNearest = roundNearest/1000;
 Serial.println(roundNearest,6);

 price = (roundNearest*1000);
 Serial.println(price,2);
 while(1){}
}

вы можете использовать roundf() как в этом видео демонстрационное видео

,