올림 및 내림

내 arduino는 온도를 측정하고 다음과 같은 값을 제공합니다. 28.58 섭씨. 소수점 한 자리로 반올림하고 싶습니다. 28.5를 표시하는 “8”을 잘라서 변수 1을 더 짧게 만들 수 있습니다. 그러나 이것은 수학적으로 정확하지 않기 때문에 속임수처럼 느껴집니다. 누구든지 반올림 / 내림하는 방법을 알고 있습니까? 내 체온이 28.6으로 표시됩니다.

추가 조언이 필요합니다. 직렬로 온도를 파이썬 코드가 실행중인 RPi로 보내고 있습니다. Arduino 코드 또는 Python 코드에서 반올림을 제안 하시겠습니까?

미리 감사합니다!

댓글

  • ' 체계적으로 반올림하는 것보다 가장 가까운 반올림하는 것이 좋습니다.
  • 예, 수학적 방식으로 반올림 할 수 있기를 바랍니다. 28.65 <, 28.6 및 28.65 ≥, 28.7이됩니다.
  • 그런 다음 Serial.print()가 다음과 같이 반올림하도록합니다. @Jot '의 대답에 따라.
  • 개인적으로 데이터가 Pi에있을 때까지 반올림하지 않습니다. 필요하지 않을 때 ' 정밀도를 잃는 이유는 무엇입니까? 나중에 Pi의 데이터에 대해 더 많은 계산을 수행해야한다고 결정하면 어떨까요? Python에는 round () 함수가 내장되어 있습니다.

Answer

내가 아는 한 Serial.print (또는 println)는 반올림 및 반올림을 수행합니다. 여러분이해야 할 일은 float 변수를 가져 와서 Serial.print( value, 1);

추가 매개 변수없이 기본값이 선택됩니다. 이는 십진수 2 자리입니다. Serial.print( value, 2);

Serial을 통해 바이트를 줄이는 이유는 무엇입니까? 십진수 두 자리를 보내고 Python으로 값을 처리 할 수도 있습니다.

댓글

  • 이것이 제 질문의 마지막 부분입니다. ) 내 Rpi의 파이썬에서 또는 보내기 전에 처리 할 위치를 궁금해합니다.
  • 모든 반올림은 가능한 한 최종 출력에 가깝게 수행해야합니다. 직렬 포트가 충분히 빠르면 Pi가 데이터를 출력 할 때 2 자리 또는 3 자리 숫자를 보내고 반올림합니다. ' 도움이 될 수 있다면 반올림 된 값을 기준으로 계산을하고 싶지 않아 오류가 발생할 가능성이 있습니다. 즉, ' 난수를 보내는 데 시간을 낭비하는 것입니다. 온도 센서에 +/- 1 도의 오류가 있으면 소수점 첫째 자리가 유용 할 수 있습니다. 무의미합니다.
  • 좋습니다. 최종 단계에서 처리하는 것이 더 정확하지만 센서의 정확도는 없기 때문에 Serial.print (value, 1);

답변

중요도를 곱하고 +0.5를 더한 다음 내림 (정수로 변환하는 것과 같음)하고 나누면 C에서 반올림 할 수 있습니다.

float f_rounded = ((int) (f * 10.0 + 0.5) / 10.0); 

28.6은 다음과 같습니다.

float f_rounded = ((int) (28.6 * 10.0 + 0.5) / 10.0) = ((int) 286.5) / 10.0 = 286 / 10.0 = 28.6 

Python에서는 동일합니다 (캐스트 연산자가 int ( …)

업데이트 : 음수의 경우 +0.5는 -0.5 여야합니다.

Edgar Bonet의 크레딧 : 양수와 음수 모두에 반올림 사용 :

float f_rounded = round(f * 10) / 10.0; 

댓글

  • -28.58가 .
  • @JohnnyMopp 댓글에 감사드립니다.
  • float f_rounded = round(f * 10) / 10.0;가 아닌가요? 긍정적 인 경우와 부정적인 경우 모두.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다