예를 들어 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 ()를 사용할 수 있습니다.