Перейти к содержанию
    

Как округлить float до сотых?

Или может быть можно задать тип float сразу, чтобы у него после запятой было только два знака?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или может быть можно задать тип float сразу, чтобы у него после запятой было только два знака?

а макс.значение целого?

может, есть смысл отобрать у uint32_t 7 бит под сотые, чем тащить float?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

максимальное значение целого предполагается не более 1000

Нельзя ли конкретно, си строкой?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или может быть можно задать тип float сразу, чтобы у него после запятой было только два знака?

Чем вам помешали лишние цифры - хотите создать свой тип float или при выводе не экран слишком много цифр?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чем вам помешали лишние цифры - хотите создать свой тип float или при выводе не экран слишком много цифр?

Мне форматированный вывод не поможет.

У меня функция, которая выводит на экран значение float. Во избежание мерацния экрана выводит она его только тогда, когда значение меняется. Значение берется из АЦП. Как вы сами понимаете, все что после 2 знака сильно шумит. Лишняя нагрузка на контроллер по выводу информации

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во избежание мерацния экрана выводит она его только тогда, когда значение меняется.

Ну так выводите не по любому изменения, а по изменению, превышающему заданный порог.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так выводите не по любому изменения, а по изменению, превышающему заданный порог.

 

господа, можно я откажусь от дальнейшего раскрытия своей задачи, а повторю вопрос - как округлить float до 2-х знаков после запятой? Спасибо за участие, но я хочу услышать ответ именно на этот вопрос, а не объяснять каждый раз почему предложенные альтернативы мне не подходят.

Я не тупой, чтобы не знать, как отформатировать float в sprintf до двух знаков.

Я не тупой, чтобы не знать как установить порог.

Если я спрашиваю, как округлить float, значит для меня это опитмальный вариант и я не хочу отнимать ваше время, объяснением, почему другие варианты не подходят.

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня функция, которая выводит на экран значение float. Во избежание мерацния экрана выводит она его только тогда, когда значение меняется. Значение берется из АЦП. Как вы сами понимаете, все что после 2 знака сильно шумит. Лишняя нагрузка на контроллер по выводу информации

А эта функция сама не может сравнить то, что ей передали сейчас и то, что она ранее выводила? Например, переданное ей число умножить на 100 и сразу преобразовать в int/long. И сравнить с ранее выведенным числом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А эта функция сама не может сравнить то, что ей передали сейчас и то, что она ранее выводила? Например, переданное ей число умножить на 100 и сразу преобразовать в int/long. И сравнить с ранее выведенным числом.

господа!

То что вы предлагаете - это вычисления.

Округление проще. Я не знаю как округлять float в C, потому и спросил.

Если подобной функции среди стандартных нет, то так и скажите. Я САМ напишу что-нибудь, сравнивающее значения, определяющее пороги или еще что-то подобное и не буду вас отвлекать. Но если есть что-то типа round(3.2222, 2), то буду рад об этом узнать.

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Десятичное округление надо делать во время преобразования в десятичный вид. Во float число не может хранится округленным до сотых.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То что вы предлагаете - это вычисления.

Оно в любом случае будет.

 

С помощью стандартных функций:

#include <math.h>

float val = 37.777779;

float rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
float nearest = roundf(val * 100) / 100;  /* Result: 37.78 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

 

http://stackoverflow.com/questions/1343890...mal-places-in-c

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Corvus я добавил #include <math.h>, floorf и все остальное мой компилятор KEIL не знает.

Попробовал просто ради интереса

 

NEW_INFO_VAR.SYSTEM_VOLTAGE=GetValue();
NEW_INFO_VAR.SYSTEM_VOLTAGE=(NEW_INFO_VAR.SYSTEM_VOLTAGE*100)/100;

Посмотрел отладчиком - значения одинаковые.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имея over 1800 сообщений на форуме не знать возможностей языка С как-то странно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имея over 1800 сообщений на форуме не знать возможностей языка С как-то странно.

А вы их знаете?

 

Пардон... math.h подключился, функции компилятор знает.

Но результат странный.

Если было число 19.69385769, то после округления получается 19.600000004

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

То что вы предлагаете - это вычисления.

Округление проще. Я не знаю как округлять float в C, потому и спросил.

Это был самый оптимизированный вариант, на чём и акцентировалась задача. Без непонятной экзотики и для любого компилятора. Вычислять можно в том месте, где собирались округлять.

 

Update

 

float в принципе не может хранить все дробные числа с точностью после запятой только два знака. Там часто число либо больше, либо меньше нужного на какой-то небольшой "мусор". Почитайте стандарт на float.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...