鱼C论坛

 找回密码
 立即注册
查看: 1292|回复: 8

[已解决]关于python格式化的问题

[复制链接]
发表于 2022-1-16 17:02:26 | 显示全部楼层 |阅读模式
25鱼币
关于python格式化的问题


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

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

大佬们,帮帮我!!!

答对者,必重金感谢!!!
兄弟们,行动起来吧!!!
最佳答案
2022-1-16 17:02:27

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,无论精度如何设定。

最佳答案

查看完整内容

https://docs.python.org/zh-cn/3.8/library/string.html#formatspec This is "e" This is "g"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-16 17:02:27 | 显示全部楼层    本楼为最佳答案   

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,无论精度如何设定。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-16 17:07:16 | 显示全部楼层
加油,兄弟们!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-16 17:47:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-16 18:04:02 | 显示全部楼层
纠结这个干啥,它是转为"科学计数法",但这过程涉及了"浮点数",保留多少位的小数精度,是它的事,不是"有问题"的事,
并且这是返回的是 字符串 的形式,不是数值类型了,通常也不会再这个基础上进行计算。
所以,你若要进行大数运算,要另寻别的办法(如其他专用数学运算模块)。它这个只是 将大数 转为 一种"科学计数的字符形式"而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-16 18:16:40 | 显示全部楼层

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

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

评分

参与人数 1鱼币 +2 收起 理由
python爱好者. + 2 说的对,但我的问题是返回的值的精度问题,.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-16 18:34:58 | 显示全部楼层
所以说就是:
使用 g 时:
小数点后的位数 就是 设定的精度参数
而使用 e 时:
小数点后的位数 却是 设定的精度参数 + 1

理解对吗?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-16 18:40:42 | 显示全部楼层
python爱好者. 发表于 2022-1-16 18:34
所以说就是:
使用 g 时:
小数点后的位数 就是 设定的精度参数

@Stubborn
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-16 19:12:30 | 显示全部楼层
本帖最后由 阿奇_o 于 2022-1-16 19:14 编辑
python爱好者. 发表于 2022-1-16 18:34
所以说就是:
使用 g 时:
小数点后的位数 就是 设定的精度参数


人家好心把文档都给出了,自己仔细读读呀。。

                               
登录/注册后可看大图

评分

参与人数 1鱼币 +2 收起 理由
python爱好者. + 2 对哦!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 12:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表