2017-04-22 8 views
0

nodemcu 모듈을 설정하여 온도 센서에서 데이터를 수집하고 mqtt pubsubclient를 사용하여 mqtt 브로커에 보내려고했지만 문제가되지 않습니다.플로팅 값에 대한 후행 0 제거 C++

온도를 하나의 십진수 만있는 형식으로 보내려고합니다.이 시점에서 필자가 성공적으로 반올림했으나 형식이 올바르지 않습니다. 이 24.50에 임시, 27.80, 23.10 등 반올림 지금의 나는이 후행 zereos를 제거하려면, 그래서, 27.8, 24.5된다 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

[부동 소수점을 정수로 설정하고 소수점 이하 자릿수로 변환 하시겠습니까?] (http://stackoverflow.com/questions/29200635/convert-float-to-string-with-set-precision-number- –

+0

올바른 답을 시도했지만 'stringstream'이이 범위에서 'stringstream stream;'라인에 대해 선언되지 않았다는 오류가 발생합니다. – Benja0906

+0

@MikeNakis - 중복 일종의 정렬입니다. 질문은 임베디드 시스템과 관련이 있으며 때로는 불완전한 표준 라이브러리가 있습니다. –

답변

0

사용자가 수행하는 작업과 상관없이 부동 소수점 값은 항상 동일한 정밀도를 갖습니다. 텍스트 문자열의 자릿수를 제어하려면 값을 텍스트로 변환하는 방법을 변경하십시오. 표준 스트림 또는 그림을 사용 중 하나에

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

사용하고있는 환경에서, 당신은해야합니다 : 일반 C++에서 (즉, 더 String 유형 <g>이없는 경우), 당신은 스트림에 그렇게 부동 소수점에서 텍스트로의 변환을 제어하는 ​​환경을 제공합니다.

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에서 검사하고 수동으로 후행 0을 제거하십시오.

std::string의 값을 생성하려면 std::ostrstream을 사용하고 대신 그 값으로 작업 할 수 있습니다.