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

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.

我试图设置一个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);

}
#包括
#包括
#包括
浮动温度=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()。