десятичное — удаление конечных нулей для значения с плавающей точкой Переполнение стека

Я пытаюсь настроить модуль nodemcu для сбора данных с датчика температуры и отправить его с помощью mqtt pubsubclient моему брокеру mqtt, но это не проблема.

Я пытаюсь отправить температуру в формате, который имеет только один десятичный знак, и в этот момент я успешно сделал округление вверх или вниз, но формат не правильный. на данный момент он округляет временную шкалу до 24,50, 27,80, 23,10 и т. д. Я хочу удалить конечные Zereos, поэтому он становится 24,5, 27,8, 23,1 и т. д.

У меня есть этот код настроен до сих пор:

#include <math.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>float temp = 0;

void loop {
float newTemp = sensors.getTempCByIndex(0);

temp = roundf((newTemp * 10)) / 10;
serial.println(String(temp).c_str())
client.publish("/test/temperature", String(temp).c_str(), true);

}

Я довольно новичок в C ++, поэтому любая помощь будет принята с благодарностью.

0

Решение

Независимо от того, что вы с ними делаете, значения с плавающей точкой всегда имеют одинаковую точность. Чтобы контролировать количество цифр в текстовой строке, измените способ преобразования значения в текст. В нормальном C ++ (т.е. там, где нет String тип <g>), вы делаете это с помощью потока:

std::ostrstream out;
out << std::fixed << std::set_precision(3) << value;
std::string text = out.str();

В среде, которую вы используете, вам придется либо использовать стандартные потоки, либо выяснить, что обеспечивает эта среда для управления преобразованиями с плавающей запятой в текст.

0

Другие решения

Непонятно, каков ваш API. Похоже, вы хотите передать в строке C. В этом случае просто используйте sprintf:

#include <stdio.h>

float temp = sensors.getTempCByIndex(0);
char s[30];
sprintf(s, "%.1f", temp);
client.publish("/test/temperature", s, true);
1

Используемая вами библиотека не является частью стандартного C ++. String вы используете нестандартно.

Как отметил в своем ответе Пит Беккер, вы не сможете контролировать конечные нули, изменяя значение temp, Вам нужно либо контролировать точность при преобразовании его в Stringили выполните преобразование, а затем настройте результирующую строку.

Если вы читаете документацию для String тип, который вы используете, могут быть варианты сделать один или оба из;

  • контролировать точность при написании float в строку; или же
  • изучить символы в String и вручную удалить конечные нули.

Или вы могли бы использовать std::ostrstream производить значение в std::stringи работать с этим вместо этого.

0
По вопросам рекламы [email protected]