切り上げと切り下げ

私のarduinoは温度を測定しており、次のような値を示します:摂氏28.58度。これを小数第1位に切り上げたいと思います。 28.5を表示する「8」をカットすることで、変数を1つ短くすることができます。しかし、これは数学的に正しくないため、不正行為のように感じます。切り上げ/切り下げの方法を知っている人はいますか。これは私の体温を28.6と表示します。

追加のアドバイスが必要です。 Pythonコードが実行されているRPiにシリアルで温度を送信しています。 ArduinoコードまたはPythonコードで丸めを行うことをお勧めしますか。

よろしくお願いします!

コメント

  • '体系的に切り上げるよりも、最も近いに切り上げる方がよいでしょう。
  • そうです、数学的な方法で切り上げることができればと思います。 28.65 <、28.6になり、28.65≥、28.7になります
  • 次に、Serial.print()に丸めを実行させます。 @Jot 'の回答による。
  • 個人的には、データが円周率になるまで丸めません。 '必要がないのに、なぜ精度が失われるのですか?後のある時点で、Piのデータに対してさらに計算を行う必要があると判断した場合はどうなりますか? Pythonには round()関数が組み込まれています。

回答

私の知る限り、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;だけではないのですか?ポジティブケースとネガティブケースの両方。

コメントを残す

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