awk舍入处理时保留指定小数位数:解决末尾0丢失问题
解决小数位数输出的两种需求:保留末尾0或直接截断
嗨,针对你遇到的小数位数输出问题,我整理了两种常见需求的实现方法,不管是用Python还是命令行工具都能轻松搞定:
需求1:舍入后强制保留指定位数(含末尾0)
很多时候默认的舍入输出会省略末尾的0,比如round(1.2340, 3)会输出1.23而不是1.230,这时候需要用固定位数的格式化输出来强制显示所有小数位。
Python实现
假设你的文件名为numbers.txt,每行一个十进制数:
with open('numbers.txt', 'r') as f, open('output_rounded.txt', 'w') as out_f: for line in f: num = float(line.strip()) # 格式化保留3位小数,自动补末尾0 formatted_num = "{:.3f}".format(num) # 或者用更简洁的f-string:formatted_num = f"{num:.3f}" out_f.write(formatted_num + '\n')
这样处理后,哪怕舍入后最后一位是0,也会完整显示三位小数,比如1.230、4.500这类结果都会正常输出。
命令行awk实现
如果不想写脚本,用awk一行命令就能搞定:
awk '{printf "%.3f\n", $1}' numbers.txt > output_rounded.txt
%.3f会强制输出三位小数,舍入规则遵循标准的四舍五入,同时保留末尾的0。
需求2:直接截断指定位数,不进行舍入
如果不需要舍入,只是想保留整数部分后的前N位小数(哪怕后面有数字也直接砍掉),可以用以下方法:
Python实现
用数学运算截断后再格式化:
with open('numbers.txt', 'r') as f, open('output_truncated.txt', 'w') as out_f: decimal_places = 3 multiplier = 10 ** decimal_places for line in f: num = float(line.strip()) # 截断到指定小数位:先放大取整,再缩小 truncated_num = int(num * multiplier) / multiplier # 同样用格式化强制显示指定位数 formatted_num = f"{truncated_num:.{decimal_places}f}" out_f.write(formatted_num + '\n')
比如数字1.2349,截断到3位小数会得到1.234,而不是舍入后的1.235,同时末尾0也会保留。
命令行awk实现
同样用数学运算截断后格式化:
awk '{num = int($1*1000)/1000; printf "%.3f\n", num}' numbers.txt > output_truncated.txt
这里int($1*1000)会直接砍掉千分位之后的数字,再除以1000恢复小数位,最后用printf强制显示三位小数。
内容的提问来源于stack exchange,提问作者bapors
相关产品推荐
相关产品推荐

