C++ 删除浮点值c+的尾随零+;
我试图设置一个nodemcu模块来从温度传感器收集数据,并使用mqtt pubsubclient将其发送到我的mqtt代理,但这不是问题所在 我试图以只有一个小数点的格式发送温度,在这一点上,我成功地使其向上或向下取整,但格式不正确。现在它将温度四舍五入到24.50、27.80、23.10等。我想删除后面的zereos,所以它变成24.5、27.8、23.1等 到目前为止,我已经设置了以下代码:C++ 删除浮点值c+的尾随零+;,c++,decimal,rounding,trailing,C++,Decimal,Rounding,Trailing,我试图设置一个nodemcu模块来从温度传感器收集数据,并使用mqtt pubsubclient将其发送到我的mqtt代理,但这不是问题所在 我试图以只有一个小数点的格式发送温度,在这一点上,我成功地使其向上或向下取整,但格式不正确。现在它将温度四舍五入到24.50、27.80、23.10等。我想删除后面的zereos,所以它变成24.5、27.8、23.1等 到目前为止,我已经设置了以下代码: #include <math.h> #include <PubSubClient.
#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);
}
#包括
#包括
#包括
浮动温度=0;
空穴环{
float newTemp=传感器。getTempCByIndex(0);
温度=roundf((新温度*10))/10;
serial.println(字符串(temp.c_str())
publish(“/test/temperature”,字符串(temp.c_str(),true);
}
<>我对C++是相当新的,所以任何帮助都会被理解。
不管你对它们做了什么,浮点值总是具有相同的精度。要控制文本字符串中的位数,请更改将值转换为文本的方式。在正常C++中(即,没有代码>字符串类型),用流:
std::ostrstream out;
out << std::fixed << std::setprecision(3) << value;
std::string text = out.str();
std::streamout;
out无论对它们做什么,浮点值总是具有相同的精度。要控制文本字符串中的位数,请更改将值转换为文本的方式。在正常C++中(即,没有代码>字符串类型),用流:
std::ostrstream out;
out << std::fixed << std::setprecision(3) << value;
std::string text = out.str();
std::streamout;
我们不清楚你的API是什么。似乎您希望传入C字符串。在这种情况下,只需使用sprintf
:
#include <stdio.h>
float temp = sensors.getTempCByIndex(0);
char s[30];
sprintf(s, "%.1f", temp);
client.publish("/test/temperature", s, true);
#包括
浮动温度=传感器。getTempCByIndex(0);
chars[30];
sprintf(s,“.1f”,温度);
发布(“/test/temperature”,s,true);
不清楚您的API是什么。似乎您希望传入C字符串。在这种情况下,只需使用sprintf
:
#include <stdio.h>
float temp = sensors.getTempCByIndex(0);
char s[30];
sprintf(s, "%.1f", temp);
client.publish("/test/temperature", s, true);
#包括
浮动温度=传感器。getTempCByIndex(0);
chars[30];
sprintf(s,“.1f”,温度);
发布(“/test/temperature”,s,true);
> > > p>你所使用的库不是标准C++的一部分。您使用的字符串是非标准的
正如Pete Becker在他的回答中所指出的,您将无法通过更改temp
的值来控制尾随的零。您需要在将其转换为字符串时控制精度,或者进行转换,然后调整结果字符串
如果您阅读了所使用的字符串
类型的文档,则可能会有执行以下一项或两项操作的选项:
- 控制将
浮点值写入字符串时的精度;或
- 检查
字符串中的字符
并手动删除尾随的零
或者可以使用<代码> STD::OSTSRESUW/DECOME在<代码> STD::String 中生成值,并使用它来代替。
< P>您所使用的库不是标准C++的一部分。您使用的字符串是非标准的
正如Pete Becker在他的回答中所指出的,您将无法通过更改temp
的值来控制尾随的零。您需要在将其转换为字符串时控制精度,或者进行转换,然后调整结果字符串
如果您阅读了所使用的字符串
类型的文档,则可能会有执行以下一项或两项操作的选项:
- 控制将
浮点值写入字符串时的精度;或
- 检查
字符串中的字符
并手动删除尾随的零
或者您可以使用std::oststream
来生成std::string
中的值,并使用该值进行处理。可能重复我尝试了正确的答案,但我得到了行stringstream的错误“'stringstream'未在此范围内声明”代码>@MikeNakis-有点重复,但有点不重复;这个问题涉及一个嵌入式系统,它们有时有不完整的标准库。可能是重复的。我尝试了正确的答案,但我得到的错误是,stringstream行的“stringstream”未在此范围内声明代码>@MikeNakis-有点重复,但有点不重复;这个问题涉及一个嵌入式系统,它们有时有不完整的标准库。它是setprecision(),而不是set_precision()。它是setprecision(),而不是set_precision()。