删除浮点值的尾随零 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
中的值,然后使用它代替。
我正在尝试设置一个 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
中的值,然后使用它代替。