【发布时间】:2017-06-09 23:38:54
【问题描述】:
在 Java 中:
String test1 = String.format("%7.2g", 3e9);
System.out.println(test1);
这打印3.0e+09
在 Python 2.7 中,如果我运行此代码
for num in [3e9, 3.1e9, 3.01e9, 3e2, 3.1e2, 3.01e2]:
print '%7.2g %7.2f %7.2e' % (num, num, num)
我明白了
3e+09 3000000000.00 3.00e+09
3.1e+09 3100000000.00 3.10e+09
3e+09 3010000000.00 3.01e+09
3e+02 300.00 3.00e+02
3.1e+02 310.00 3.10e+02
3e+02 301.00 3.01e+02
嗯?看起来精度 (.2) 参数在 Python 的 %g 中的处理方式与 Python 的 %f、Python 的 %e 或 Java 的 %g 完全不同。这是doc(我的重点):
一般格式。对于给定的精度 p >= 1,这会将数字四舍五入为 p 个有效数字,然后根据其大小将结果格式化为定点格式或科学计数法。
精确的规则如下:假设用表示类型'e'和精度p-1格式化的结果将具有指数exp。然后如果 -4 在这两种情况下,都会从有效数字中删除不重要的尾随零,如果小数点后面没有剩余数字,也会删除小数点。
正负无穷、正负零和nans,无论精度如何,都分别格式化为inf、-inf、0、-0和nan。
0 的精度等同于 1 的精度。默认精度为 6。
WTF?有什么办法可以防止那些尾随零被删除?字符串格式化的重点是实现某种一致性,例如用于文本对齐。
有没有什么方法可以让 Java 行为(本质上是小数点右侧的有效位数)而不必从头开始重写整个事情?
【问题讨论】:
标签: python python-2.7 string-formatting