这三个数字都有一个共同点:两位数的准确度。假设我想报告几个非常不同的设备的计算带宽,范围从每秒千字节到每秒千兆字节,所有这些设备的变化都高达%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

干得好。

10-04 10:48