这三个数字都有一个共同点:两位数的准确度。假设我想报告几个非常不同的设备的计算带宽,范围从每秒千字节到每秒千兆字节,所有这些设备的变化都高达%10。对于我的读者来说,最简单的方法就是把所有的数据转换成一个通用的单位(比如MB/s),把小数点排成一行,
1.2
0.0034
56000
并且避免打印无关的数字;如果我的计算值是1.193225、0.00344791和56188.5622,那么我的读者只需要看到上面的内容——剩下的就是噪音。尽管有大量的浮点数格式选项,但Python似乎没有一种干净的方法来以固定的精度打印数字。最好的办法是什么?
给这个问题打分的注意事项:我将选择最好的答案(即简单、易懂、优雅)而不是第一个答案。不用着急。
最佳答案
import math
def round_s(n):
if not n:
return n
e = int(math.floor(math.log10(abs(n)))) - 1
return round(n, -e)
def fmt(n, size):
return '{n:{size}f}'.format(size=size, n=n).rstrip('0').rstrip('.')
numbers = [
1.193225,
1.0,
0,
-1.0,
0.00344791,
-0.00344791,
56188.5622,
-56188.5622,
]
for n in numbers:
print '{:12.5f} => {}'.format(n, fmt(round_s(n), 14))
输出:
1.19322 => 1.2
1.00000 => 1
0.00000 => 0
-1.00000 => -1
0.00345 => 0.0034
-0.00345 => -0.0034
56188.56220 => 56000
-56188.56220 => -56000
干得好。