Arduino는 가장 가까운 0.5로 반올림합니다.

예를 들어 34.26 또는 11.92 또는 2.51과 같이 이중 값이 있습니다. 0.5 단위로 반올림하여 1.34-> 1.50 및 32.78-> 33 및 21.09-> 21.00

어떻게해야합니까?

댓글

  • ' 플로트를 사용하지 않는 것이 좋습니다. 0.5 = 50, 1.34 = 134, 32.78 = 3278이면 계산이 더 빠르고 효율적이어야합니다.
  • 또한 '에서 134가 있다고 가정합니다. 134 % 50을 수행하면 34가 반환되고 '가 24 이상 (under = 0으로 반올림)과 74 이상 (under는 50으로 반올림)인지 확인할 수 있습니다. 그렇지 않으면 100으로 반올림합니다.

Answer

float를 사용하는 것은 매우 나쁜 생각입니다.
그렇게 말하고 있습니다. 2를 곱하고 표준 라운드를 수행합니다.
그런 다음 2로 다시 나눕니다.

예 :

1.34 *2 = 2.68 round(2.68) = 3 3 /2 = 1.5 

32.78 *2 = 65.56 round(65.56)= 66 66 /2 = 33 

댓글

  • 2 곱하기는 실제로 매우 영리합니다.
  • 금전 등록기에서 가장 가까운 0.10 및 0.05에도 일반적으로 사용됩니다 (10, 20 사용).

답변

첫 번째로 떠오른 것부터 약간의 알고리즘을 만들었습니다. 정수를 사용하고 있습니다. 부동 소수점으로 더 잘 작동한다고 생각하기 때문입니다.

예를 들어 유로를 센트로 표시하여 부동 소수점을 사용하여 나타낼 수 있습니다.

unsigned int roundToFifty(unsigned int nonRound){ unsigned int rest = nonRound % 50; unsigned int fits = floor(nonRound / 50); unsigned int add = 0; if(rest >= 25){ if(rest >= 75){ add = 100 }else{ add = 50 } } return fits*50+add } 

실제로 알고리즘이 좀 이상하고 더 간단하고 효과적인 것이 존재할 수도 있다고 생각합니다. 제 생각에 가장 먼저 떠오른 것이 었습니다.

답변

float i=1.5237475984328953; #include "math.h" void setup() { Serial.begin(9600); } void loop() { Serial.println(i,6); float price = i*1000; Serial.println(price,2); float roundNearest = roundf(i*1000) ; // x 100 for two decimal place roundNearest = roundNearest/1000; Serial.println(roundNearest,6); price = (roundNearest*1000); Serial.println(price,2); while(1){} } 

이 비디오 데모 비디오

와 같이 roundf ()를 사용할 수 있습니다.

답글 남기기

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