Округлить до ближайших 0,5
У меня есть двойное значение, например: 34,26, 11,92 или 2,51. Его следует округлить до ближайшего 0,5, поэтому 1,34 -> 1,50 и 32,78 -> 33 и 21,09 -> 21,00
Как это сделать?
@Number_987, 👍1
Обсуждение3 ответа
Лучший ответ:
Очень плохая идея использовать 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
Я составил небольшой алгоритм из первого, что пришло мне в голову. Я использую целые числа, так как считаю, что они лучше работают с числами с плавающей запятой.
Например, вы можете представить евро (с плавающей запятой), выразив их в центах.
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
}
Я на самом деле думаю, что алгоритм немного странный, и что также может существовать что-то более простое/более эффективное. Это было первое, что пришло мне в голову.
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() как в этом видео демонстрационное видео
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Я бы предложил даже не использовать поплавки. 0,5 = 50, 1,34 = 134, 32,78 = 3278 должны сделать вычисления быстрее/эффективнее., @Paul
Кроме того, допустим, у вас есть 134, вы можете сделать 134%50, что вернет 34, а затем вы можете проверить, больше ли оно 24 (меньше = округлить до 0) и больше 74 (меньше округлить до 50), а иначе вы округлите до 100., @Paul