python爱好者. 发表于 2022-1-16 17:02:26

关于python格式化的问题

关于python格式化的问题

大佬们,这里有个问题,不知道为什么会这样:
print("{:g}".format(6666666666))
输出结果是:
6.66667e+09

print("{:e}".format(6666666666))
输出结果是:
6.666667e+09

但为什么6.666667e + 09 与 6.66667e+09 相差一个数字 6 呢?明明都是对应6666666666的呀!?

大佬们,帮帮我!!!
{:10_254:} {:10_254:} {:10_254:} {:10_254:}
答对者,必重金感谢!!!
兄弟们,行动起来吧!!!
{:10_257:} {:10_297:} {:10_281:} {:10_298:}

Stubborn 发表于 2022-1-16 17:02:27

python爱好者. 发表于 2022-1-16 17:47
@Stubborn @傻眼貓咪

https://docs.python.org/zh-cn/3.8/library/string.html#formatspec

This is "e"
科学计数法。 对于一个给定的精度 p,数字格式化为以字母 'e' 分隔系数和指数的科学计数法形式。 系数在小数点之前有一位,之后有 p 位,总计 p + 1 个有效数位。 如未指定精度,则会对 float 采用小数点之后 6 位精度,而对 Decimal 则显示所有系数位。 如果小数点之后没有数位,则小数点也会被略去,除非使用了 # 选项。

This is "g"
       
常规格式。 对于给定精度 p >= 1,这会将数值舍入到 p 个有效数位,再将结果以定点格式或科学计数法进行格式化,具体取决于其值的大小。 精度 0 会被视为等价于精度 1。

准确的规则如下:假设使用表示类型 'e' 和精度 p-1 进行格式化的结果具有指数值 exp。 那么如果 m <= exp < p,其中 m 以 -4 表示浮点值而以 -6 表示 Decimal 值,该数字将使用类型 'f' 和精度 p-1-exp 进行格式化。 否则的话,该数字将使用表示类型 'e' 和精度 p-1 进行格式化。 在两种情况下,都会从有效数字中移除无意义的末尾零,如果小数点之后没有余下数字则小数点也会被移除,除非使用了 '#' 选项。

如未指定精度,会对 float 采用 6 个有效数位的精度。 对于 Decimal,结果的系数会沿用原值的系数数位;对于绝对值小于 1e-6 的值以及最小有效数位的位值大于 1 的数值将会使用科学计数法,在其他情况下则会使用定点计数法。

正负无穷,正负零和 nan 会分别被格式化为 inf, -inf, 0, -0 和 nan,无论精度如何设定。

python爱好者. 发表于 2022-1-16 17:07:16

加油,兄弟们!

python爱好者. 发表于 2022-1-16 17:47:13

@Stubborn @傻眼貓咪

阿奇_o 发表于 2022-1-16 18:04:02

纠结这个干啥,它是转为"科学计数法",但这过程涉及了"浮点数",保留多少位的小数精度,是它的事,不是"有问题"的事,
并且这是返回的是 字符串 的形式,不是数值类型了,通常也不会再这个基础上进行计算。
所以,你若要进行大数运算,要另寻别的办法(如其他专用数学运算模块)。它这个只是 将大数 转为 一种"科学计数的字符形式"而已。

傻眼貓咪 发表于 2022-1-16 18:16:40

python爱好者. 发表于 2022-1-16 17:47
@Stubborn @傻眼貓咪

其实这不是 Python 才会这样,其它如 C/C++ 语言同样也是如此,你给定的例子不够明显,我给个更明显的例子吧:
C#include <stdio.h>

int main()
{
    double a = 392.65;
    printf("%e\n", a);
    printf("%g\n", a);
    return 0;
}Pythona = 392.65
print("{:e}".format(a))
print("{:g}".format(a))打印结果:3.926500e+02
392.65
这是为什么呢?其实 %g 如同 %e,只是以最简约方式呈现值而已。

python爱好者. 发表于 2022-1-16 18:34:58

所以说就是:
使用 g 时:
小数点后的位数 就是 设定的精度参数
而使用 e 时:
小数点后的位数 却是 设定的精度参数 + 1

理解对吗?
{:10_257:}{:10_254:}

python爱好者. 发表于 2022-1-16 18:40:42

python爱好者. 发表于 2022-1-16 18:34
所以说就是:
使用 g 时:
小数点后的位数 就是 设定的精度参数


@Stubborn

阿奇_o 发表于 2022-1-16 19:12:30

本帖最后由 阿奇_o 于 2022-1-16 19:14 编辑

python爱好者. 发表于 2022-1-16 18:34
所以说就是:
使用 g 时:
小数点后的位数 就是 设定的精度参数


人家好心把文档都给出了,自己仔细读读呀。。
https://s4.ax1x.com/2022/01/16/7NVOu8.png
页: [1]
查看完整版本: 关于python格式化的问题