49.765 是我的一系列命令的输出。我想使用 print f 将其舍入两位小数为 49.77。
它的代码是什么?
答案1
$ x=49.765
$ printf "%.2f" $(echo "$x + 0.005" | bc)
您必须使用外部命令,因为 中没有内置舍入功能printf(1)
,并且 POSIX shell 没有内置浮点运算。
要四舍五入到最接近的小数位,请添加 0.5 并截断。要四舍五入到最接近的十分之一,请将“微移因子”除以 10,依此类推。
缺乏内置设施常常促使人们使用 Perl 之类的东西而不是 shell:
$ 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
捕获变量中“命令环”的输出并使用printf
.
$ x=49.765
$ printf '%.2f\n' "$x"
49.76
舍入是通过数字的二进制表示形式按照“舍入到最接近的偶数”规则完成的。请理解,在大多数情况下,二进制表示并不完全等于给定的数字。