私のarduinoは温度を測定しており、次のような値を示します:摂氏28.58度。これを小数第1位に切り上げたいと思います。 28.5を表示する「8」をカットすることで、変数を1つ短くすることができます。しかし、これは数学的に正しくないため、不正行為のように感じます。切り上げ/切り下げの方法を知っている人はいますか。これは私の体温を28.6と表示します。
追加のアドバイスが必要です。 Pythonコードが実行されているRPiにシリアルで温度を送信しています。 ArduinoコードまたはPythonコードで丸めを行うことをお勧めしますか。
よろしくお願いします!
コメント
回答
私の知る限り、Serial.print(またはprintln)は切り上げと切り下げを行います。 float変数を取得してSerial.print( value, 1);
を実行するだけです。
追加のパラメーターを指定しない場合、デフォルトが選択されます。これは10進数の2桁です。Serial.print( value, 2);
なぜシリアルよりもバイトを短くしたいのですか?小数点以下2桁を送信して、Pythonで値を処理することもできます。
コメント
- これが私の質問の最後の部分です。 )RpiのPythonで、または送信する前に、どこで処理するか疑問に思っています。
- 丸めは、可能な限り最終出力の近くで行う必要があります。シリアルポートが十分に高速である場合は、Piがデータを出力しているときに2桁または3桁を送信して丸めます。 '助けてくれるなら、四捨五入された値に基づいて計算をしたくないので、エラーが発生する可能性があります。とはいえ、'乱数を送信するのは時間の無駄です。温度センサーの誤差が+/- 1度の場合は、小数点以下第1位が役立つ可能性があります。意味がありません。
- 同意しました。最終段階で処理する方が正確ですが、センサーの精度がないため、Serial.print(value、1);
回答
Cで、有意性を乗算し、+ 0.5を加算し、切り捨て(整数へのキャストと同じ)して除算することで丸めることができます。
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;
だけではないのですか?ポジティブケースとネガティブケースの両方。
Serial.print()
に丸めを実行させます。 @Jot 'の回答による。