删除拖尾零为一个浮点值C++

问题描述:

我想设置一个nodemcu模块来从温度传感器收集数据,并将它使用mqtt pubsubclient发送到我的mqtt代理,但这不是问题。删除拖尾零为一个浮点值C++

我想以只有一位小数的格式发送温度,在这一点上,我已经成功地将它向上或向下舍入,但格式不正确。截至目前便将临时到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++,所以任何帮助将不胜感激。

+1

[将float转换为具有设置精度和十进制数字的字符串的可能的重复?](http://*.com/questions/29200635/convert-float-to-string-with-set-precision-number-的十进制数字) –

+0

我试过了正确的答案,但是我得到的错误''stringstream'没有在这个范围内声明'stringstream流'; – Benja0906

+0

@MikeNakis - 重复排序,但排序不是;这个问题涉及到一个嵌入式系统,他们有时会有不完整的标准库。 –

不管你对它们做什么,浮点值总是具有相同的精度。要控制文本字符串中的数字位数,请更改将值转换为文本的方式。在普通的C++(即在没有String型<克>),你这样做,与流:

std::ostrstream out; 
out << std::fixed << std::set_precision(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中的值,并使用它。