次のような加速度計から浮動小数点値を取得しました。
-3.04299553323
たとえば、-3.04 を取得したいと思います。その float 値を丸める簡単な方法はありますか?
編集:
次のような加速度計から浮動小数点値を取得しました。
-3.04299553323
たとえば、-3.04 を取得したいと思います。その float 値を丸める簡単な方法はありますか?
編集:
これは、エンド ユーザーに表示するために数値をフォーマットするときにのみ行う必要があります。
float rounded = roundf(orig * 100) / 100.0;
または同様のものは正確な答えを返します。
確かに、一般的にはそうではありません。たとえば、
float f = 123456.3;
float r = roundf(f * 100) / 100.0;
printf("%.2f, %.10f\n", r, r);
出力する
123456.30, 123456.2968750000
おっとっと!
notを使用doubleするとfloat役立ちますが、それでも、コードを少し変更すると、実際には問題が解決しないことがわかります。
double f = 123456.3;
double r = round(f * 100) / 100.0;
printf("%.2f, %.20f\n", r, r);
繰り返しますが、
123456.30, 123456.30000000000291038305
これは、正確に丸められていないことを明確に示しています。
とにかく、おおよそround(f * 100) / 100.0のラウンドだけを行うというのが物語の教訓です。場合によってはこれで十分な場合もありますが、結果が実際には丸められていないことに注意する必要があります。
より良いものが必要な場合は、代わりに 10 進演算を使用する必要があります。これを行うには、値を整数として保持するか (たとえば、通貨の値の場合、ポンドまたはドルではなくペンスまたはセントで保持します)、またはウィキペディアの 10 進浮動小数点ページで見つけることができるさまざまな 10 進浮動小数点パッケージのいずれかを使用します。 .
100を掛けて(必要に応じて最も近い整数に切り上げ/切り下げ)、整数部分を取り、もう一度100で割ります
小数点以下の桁数に適用され、10 ^(小数点以下の数)で乗算/除算されます。