2008年11月5日星期三

Python中浮点数的输出

Python中可像在C中一样,借助格式串来控制浮点数的输出。共有e/E、f和g三种格式转换符控制浮点数的输出,f用小数形式输出,e用指数形式输出,用g的话当幂大于或等于6时用指数,否则用小数。e、f和g在小数位数方面有什么不同呢?我试验了一下(Python版本是3.0rc1+):
>>> f=1/70
>>> print('%.3e %.3f %.3g' % (f,f,f))
1.429e-02 0.014 0.0143
对e/f/g都指定精度为3,结果e输出了4位有效数字(3位小数),f输出了3位小数,g输出了3位有效数字。再来一例:
>>> f=1200000
>>> print('%.3e %.3f %.3g' % (f,f,f))
1.200e+06 1200000.000 1.2e+06
e和f依旧输出3位小数。但g只输出了两位有效数字,是因为再多的有效数字都是结尾的零,为了好看就没有输出。下例也证明了这个说法:
>>> f=1.2
>>> print('%.3e %.3f %.3g' % (f,f,f))
1.200e+00 1.200 1.2
上面两例中,e和f都忠诚地输出了无用的零,但g却尽可能输出简洁的结果。

f这种输出固定小数位数的方式在某些地方是有用的,比如一系列代表权重的数字,我们希望它们的小数位数一样,这样加起来能够正好等于1。在类似场景中,e也同样适用。g可以给出最清晰的输出,但是不保证输出结果中有效数字位数或者小数位数等于指定的“精度”。

另外,既然格式串能够控制输出小数位数,在程序中就不需要round函数了,这样可以保证计算的精度。只需在输出的时候用格式串来控制小数位数。

上面提了有效数字,想搞清楚有效数字到底是啥含义,却发现维基百科上没有这个条目,顺手创建了有效数字的条目,结果发现我自己也说不清楚 = =。

没有评论: