HOWTO · Arduino
Arduino에서 float를 가장 가까운 정수로 반올림하는 방법
Arduino의 round()가 부동소수점 값을 가장 가까운 정수로 반올림하는 방식, 양수와 음수의 중간값이 어떻게 동작하는지, 원하는 소수 자릿수로 반올림하는 방법을 알아보세요.
이 페이지의 내용
Arduino의 round() 함수를 사용하면 float 값에서 가장 가까운 정숫값을 얻을 수 있습니다. 두 정수의 정확히 중간에 있는 값은 0에서 먼 방향으로 반올림되므로 5.5는 6이 되고 -3.5는 -4가 됩니다. 정숫값이 필요한 경우 결과를 int에 저장할 수 있습니다.
Arduino에서 round()가 하는 일
round()는 가장 가까운 정수에 해당하는 부동소수점 값을 반환합니다. 이 결과를 int에 대입하면 정수 값으로 저장됩니다. 예를 들어 round(3.6)은 4를 반환하고 round(-2.3)은 -2를 반환합니다. 이 함수는 이후 계산에 사용할 값을 바꾸지만, 결과를 다시 대입하지 않는 한 원래 변수의 값은 바꾸지 않습니다.
다음 완전한 C++ 프로그램은 정수로 반올림하는 방법과 측정값을 소수점 둘째 자리까지 조정하는 방법을 보여 줍니다. 같은 규칙을 따르는 표준 C++ round 함수를 사용합니다. Arduino 스케치에서는 필요에 따라 round()를 호출하고 값을 Serial로 보내면 됩니다. 이 예제는 단독으로 실행할 수 있으며, 실행하면 결과에 이름을 붙여 출력합니다.
#include <cmath>
#include <cstdio>
int main() {
float positive = 5.5f;
float belowZero = -3.5f;
float measurement = 7.4567f;
int roundedPositive = static_cast<int>(std::round(positive));
int roundedBelowZero = static_cast<int>(std::round(belowZero));
float roundedMeasurement = std::round(measurement * 100.0f) / 100.0f;
std::printf("positive: %d\n", roundedPositive);
std::printf("below zero: %d\n", roundedBelowZero);
std::printf("measurement: %.2f\n", roundedMeasurement);
return 0;
}
양수와 음수 반올림
양수는 가장 가까운 정수로 반올림됩니다. 중간값보다 작은 값은 아래 정수로, 중간값과 같거나 큰 값은 위 정수로 반올림됩니다. 따라서 5.4는 5가 되고 5.5와 5.6은 6이 됩니다. 정확히 중간에 있는 값은 0에서 먼 쪽으로 반올림됩니다.
음수에도 같은 중간값 규칙이 적용됩니다. 예를 들어 -3.4는 -3이 되고 -3.5와 -3.6은 -4가 됩니다. 이는 뱅커스 반올림이 아닙니다. 중간값에서 짝수를 우선하도록 반올림 방향을 바꾸지 않습니다. 결과를 int에 대입할 예정이라면 반올림한 값이 해당 형식의 범위 안에 들어오는 입력을 선택하세요.
원하는 소수 자릿수까지 반올림
round()만 사용하면 정수로 반올림됩니다. 원하는 소수 자릿수까지 반올림하려면 해당 자릿수에 맞는 10의 거듭제곱을 곱한 다음 round()를 호출하고, 마지막으로 그 값을 다시 나눕니다. 소수점 둘째 자리까지 반올림할 때는 100을 사용합니다. 예를 들어 7.4567은 약 7.46이 됩니다.
이 배율 조정 방식은 여러 표시 및 계산 용도에 쓸 수 있지만, float 값은 유한한 이진 정밀도로 저장됩니다. 십진수 값을 정확히 표현하지 못할 수 있으므로 중간값에 가까운 값은 이상적인 십진수 연산과 다른 결과를 낼 수 있습니다. 더 높은 정밀도가 필요한 계산에서는 원래 값을 유지하고, 화면에 고정된 소수 자릿수만 표시하면 될 때는 출력 형식을 지정하세요. 배율 조정도 저장값을 정확하게 만들지는 않습니다. 사용 가능한 정밀도에 따라 반올림 결과를 바꿀 뿐입니다.
Arduino 스케치에서 반올림한 값 사용하기
스케치에서는 배열 인덱스를 선택하거나 정수 형태의 측정값을 표시하는 경우처럼 정수가 유용한 곳에 결과를 대입하세요. 대입하기 전에 반올림한 값이 int의 범위에 들어오는지 확인하세요. 시리얼 모니터에 표시하려면 Serial.println(round(sensorValue));와 같이 작성하면 반올림한 값이 출력됩니다. 위의 완전한 프로그램은 호스트에서 실행하는 C++ 예제이며 Arduino 하드웨어나 Arduino의 Serial 객체를 사용하지 않습니다.
매핑 전에 반드시 반올림해야 하는 것은 아닙니다. map()은 정수 인수를 받으므로 부동소수점 측정값을 먼저 정수로 바꾸려는 경우에는 반올림이 도움이 될 수 있지만, 모든 매핑 작업에 필요한 것은 아닙니다. 정수 매핑 동작은 Arduino map() 함수를 참고하세요.