Как сопоставить целые значения и округлить их до десятков/тысяч?

Я сопоставляю потенциометр от 0–1023 до 1000–120 000 (от 1 секунды до 2 минут) для таймера, например:

maxDelay = map (pot2, 0, 1023, 1000, 120000);

Обе переменные являются целыми числами. Теперь я хотел бы преобразовать/округлить значения до 10 секунд (счет тысяч), поэтому, если у меня есть что-то от 1001-5000, это будет округлено до 1000 (1 секунда), а если у меня есть 5001-10000, это будет округляется до 10000 (10 секунд), затем 20 секунд, 30 секунд и т. д., пока не достигнет 120 секунд. Я знаю, что мог бы придумать несколько утверждений «если», но я пытаюсь найти правильный способ выполнения этих математических вычислений. Спасибо.

, 👍0


1 ответ


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

1

Я еще не компилировал его, но что-то вроде этого должно работать:

#include <Math.h>

int converter(int x)
{
    if(x <= 5000)
        return 1000;
    else 
        return (int)(round(x / 10000.0) * 10000.0);
}
,

Я не уверен, что это то, что я ищу... например, если значение (x) равно 2500, деление на 1000 равно 2,5... ожидаемый результат - 1000. Как это будет происходить? округлить значения?, @Chu

В чудесном мире, если целые числа, делящие 2500 на 1000, дают нам 2. Кажется, я неправильно понял ваш вопрос. Вы хотите, чтобы система показывала только значения 1,10,20,30... Верно?, @Filip Franik

верно, но мне все равно нужно, чтобы оно было 1000, если оно меньше 5000... но в этом случае я могу просто использовать ЕСЛИ. Но если число превышает 5000, например 8000, в результате должно получиться 10000... (округляет от 8 до 10 и т. д.). От 17000 до 20000..., @Chu

Да, 1, 10, 20, 30... и всё., @Chu

Замечательно! теперь выглядит хорошо, я попробую и дам вам знать. Спасибо., @Chu

Извините, это все еще не работает для округления 17000 до 20000, подождите минутку., @Filip Franik

да, я заметил, что он всегда округляет числа в меньшую сторону... это не то, чего я ожидал, но все в порядке, он должен выполнять свою работу. Хотя, если вы хотите улучшить ответ, я тоже ценю. Спасибо! :), @Chu

К сожалению, вместо использования свойств целого числа мне пришлось использовать метод round. Это не так элегантно (для корректной работы требуется приведение к двойному значению, а затем обратно к целочисленному), но этот подход должен делать именно то, что вы хотите., @Filip Franik

Просто примечание на будущее (если кто-то ищет подобное решение): на Arduino Due это должно работать нормально, но на платах Atmega я использовал беззнаковое длинное число вместо целого числа, поскольку эти значения превышают 32 767., @Chu