printf を使用して 49.765 を 49.77 に丸めますか?

printf を使用して 49.765 を 49.77 に丸めますか?

49.765 は、一連のコマンドからの出力です。print f を使用して、これを 2 桁の小数点以下 49.77 に丸めたいと思います。

そのコードは何ですか?

答え1

$ x=49.765
$ printf "%.2f" $(echo "$x + 0.005" | bc)

には丸め機能が組み込まれておらずprintf(1)、POSIX シェルには浮動小数点演算が組み込まれていないため、外部コマンドを使用する必要があります。

最も近い小数点以下の桁に丸めるには、0.5 を加算して切り捨てます。最も近い 10 分の 1 に丸めるには、「ナッジ係数」を 10 で割ります。

この組み込み機能の欠如が、多くの場合、シェルではなく Perl のようなものを使用するように人々を駆り立てるものです。

$ perl -e 'printf "%.2f", 49.765 + 0.005'

同じことですが、すべて単一のプロセスで処理されます。

答え2

四捨五入には次のコマンドを使用できます。

浮動小数点数値 = 49.765; printf("%0.2f", 数値);

小数点以下の2桁を取得できるはずです。

ただし、これは印刷するだけで、値は更新されません。変数の値を変更する場合は、以下を使用する必要があります。

#include <math.h>

float val = 49.765;

float rounded_down = floorf(val * 100) / 100;   /* Result: 49.76 */
float nearest = roundf(val * 100) / 100;  /* Result: 49.77 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 49.77 */

選択できる丸めルールは 3 つあります。切り捨て (つまり、小数点 2 桁目以降を切り捨てる)、最も近い値に丸める、および切り上げです。通常は、最も近い値に丸めます。

他の何人かが指摘しているように、浮動小数点表現の癖により、これらの丸められた値は「明らかな」 10 進数値とまったく同じではないかもしれませんが、非常に近い値になります。

答え3

「コマンドのリング」の出力を変数にキャプチャし、 を使用しますprintf

$ x=49.765

$ printf '%.2f\n' "$x"
49.76

丸めは、最も近い偶数に丸めるという規則に従って、数値のバイナリ表現に対して行われます。ほとんどの場合、バイナリ表現は指定された数値と正確に一致しないことに注意してください。

関連情報