Arduinoを0.5に最も近い値に丸めます

たとえば、34.26、11.92、または2.51の2つの値があります。 0.5に最も近い値に丸める必要があるため、1.34-> 1.50および32.78-> 33および21.09-> 21.00

これを行う方法は?

コメント

  • I ' dは、フロートを使用しないことをお勧めします。 0.5 = 50、1.34 = 134、32.78 = 3278、計算をより速く/より効率的にする必要があります。
  • また、'に134があるとしましょう。 134%50を実行できます。これにより34が返され、'が24より上(= 0に丸める)および74より上(50に丸められる)であるかどうかを確認できます。それ以外の場合は100に丸めます。

回答

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()を使用できますデモビデオ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です