2017-04-22 124 views
0

我想設置一個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://stackoverflow.com/questions/29200635/convert-float-to-string-with-set-precision-number-的十進制數字) –

+0

我試過了正確的答案,但是我得到的錯誤''stringstream'沒有在這個範圍內聲明'stringstream流'; – Benja0906

+0

@MikeNakis - 重複排序,但排序不是;這個問題涉及到一個嵌入式系統,他們有時會有不完整的標準庫。 –

回答

0

不管你對它們做什麼,浮點值總是具有相同的精度。要控制文本字符串中的數字位數,請更改將值轉換爲文本的方式。在普通的C++(即在沒有String型<克>),你這樣做,與流:

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

在您使用的環境,你必須要麼使用標準流或圖瞭解該環境提供的用於控制浮點到文本轉換的內容。

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); 
0

您使用的庫不是標準C++的一部分。您正在使用的String是非標準的。

正如Pete Becker在他的回答中指出的那樣,您將無法通過更改temp的值來控制尾隨零。您需要在將其轉換爲String時控制精度,或者執行轉換,然後調整結果字符串。

如果您閱讀了您正在使用的String類型的文檔,可能會出現兩個選項中的一個或兩個;

  • 控制將float寫入字符串時的精度;或
  • 檢查String中的字符並手動刪除尾隨零。

或者您可以使用std::ostrstream來生成std::string中的值,並使用它。