删除浮点值的尾随零 C++

removing trailing zeroes for a float value c++

我正在尝试设置一个 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++ 的新手,所以任何帮助将不胜感激。

无论您对它们做什么,浮点值始终具有相同的精度。要控制文本字符串中的位数,请更改将值转换为文本的方式。在普通的 C++ 中(即没有 String type 的地方),你用一个流来做到这一点:

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

在您使用的环境中,您必须要么使用标准流,要么弄清楚该环境提供了什么来控制浮点到文本的转换。

不清楚你的 API 是什么。似乎您想传入 C 字符串。在那种情况下,只需使用 sprintf:

#include <stdio.h>

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

您使用的库不是标准 C++ 的一部分。您使用的 String 是非标准的。

正如 Pete Becker 在他的回答中指出的那样,您将无法通过更改 temp 的值来控制尾随零。您需要在将其转换为 String 时控制精度,或者进行转换然后调整结果字符串。

如果您阅读了您正在使用的 String 类型的文档,可能会有执行其中一项或两项操作的选项;

  • 控制将float写入字符串时的精度;或
  • 检查 String 中的字符并手动删除尾随零。

或者您可以使用 std::ostrstream 生成 std::string 中的值,然后使用它代替。