【问题标题】:removing trailing zeroes for a float value c++删除浮点值c ++的尾随零
【发布时间】:2017-09-19 18:36:49
【问题描述】:

我正在尝试设置一个 nodemcu 模块来从温度传感器收集数据,并使用 mqtt pubsubclient 将其发送到我的 mqtt 代理,但这不是问题。

我正在尝试以只有一位小数的格式发送温度,此时我已成功将其向上或向下舍入,但格式不正确。截至目前,它将温度四舍五入到 24.50、27.80、23.10 等。我想删除尾随的零点,所以它变成 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++ decimal rounding trailing


【解决方案1】:

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

#include <stdio.h>

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

【讨论】:

    【解决方案2】:

    无论您对它们做什么,浮点值始终具有相同的精度。要控制文本字符串中的位数,请更改将值转换为文本的方式。在普通 C++ 中(即,没有 String 类型 ),您可以使用流来执行此操作:

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

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

    【讨论】:

    • 这是 setprecision(),而不是 set_precision()。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-15
      • 2020-09-11
      • 2011-05-30
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2019-02-03
      相关资源
      最近更新 更多