鱼C论坛

 找回密码
 立即注册
查看: 1786|回复: 9

[已解决]关于python format的用法

[复制链接]
发表于 2020-9-28 19:55:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 晴天团团团 于 2020-9-28 20:03 编辑

(1)
>>> c='{:.6}'.format(27.888,'GB')
>>> c
'27.888'
>>> d='{:.8}'.format(27.888,'GB')
>>> d
'27.888'
>>> c==d
True

为什么c==d?

(2)
>>> a= '{:.88}'.format(27.888,'GB')
>>> a
'27.888000000000001676880856393836438655853271484375'
>>> b= '{:.888}'.format(27.888,'GB')
>>> b
'27.888000000000001676880856393836438655853271484375'
>>> a==b
True


为什么a==b?为什么a,b保留这么几十位小数?

(3)
>>> '{:.888}'.format('27.888''GB')
'27.888GB'

为什么是这样的结果?

(4)
>>> '{:.1}'.format(27.888,'GB')
'3e+01'
>>> '{:.2}'.format(27.888,'GB')
'2.8e+01'
>>> '{:.3}'.format(27.888,'GB')
'27.9'

为什么是这样的结果?


最佳答案
2020-9-28 21:58:32
本帖最后由 sunrise085 于 2020-10-23 16:46 编辑

感觉好无语哟。自己给自己挖坑,然后还出不来了。。。

你的这些例子中,第三个最简单,最后再说,先说另外三个
在这几个例子中,前面只有一个填位符,而后面俩参数,所以第二个参数 'GB' 根本没用。
前面的填位符中都没有写 f ,所以不把后面的内容当成浮点数,仅仅是当成字符串,点后面的数字就是字符串的长度,但也不是把你所写的这个数字27.888当成字符串,而是把这个原数当成字符串。

第一个和第二个例子,之所以相等,是因为他们就是字符串啊,字符串每个字符一致,那么两个字符串就相等呗
先说第二个例子中,a和b为什么是这么多位。
27.888在python中是多少呢?
可以通过下面这个看看
>>> import decimal
>>> decimal.Decimal(27.888)
Decimal('27.888000000000001676880856393836438655853271484375')
>>> 
我们可以看出,他就是你所得到的那个a字符串中的内容。也就是说不管你写88还是888,他只有50位有效数字,因为原数内容就这么多
再说第一个例子,一个写的是6,一个写的是8,但是最后出来的都是五位有效数字 '27.888'。看上面得到的那个27.888的原数,前面几位有数字,从第七位开始为0,一直到第16位都为0,第17位小于5,所以这里你写5~16位得到的结果都一样,都是'27.888'

上面的明白了之后,第四个例子,就好讲了
第四个例子中,前两条,一位或两位有效数字,因为整数部分有两位,就只能写成这种科学计数法了。第三条,三位有效数字,就直接四舍五入了

最后说一下第三个例子。前面也是一个占位符,后面的参数是 '27.888''GB' 这个中间没有逗号,所以这是一个拼接字符串,是一个参数,相当于 '27.888GB'。因为后面的参数就是个字符串,那就简单了前面要几位,就给几个字符,但最多只有八个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 20:16:00 | 显示全部楼层
.x x是多少就保留多少位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 20:39:35 | 显示全部楼层
27.888000000000001676880856393836438655853271484375和27.888是同一个数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 20:44:51 | 显示全部楼层
Python 中使用双精度浮点数来存储小数。在 Python 使用的 IEEE 754 标准(52M/11E/1S)中,8字节64位存储空间分配了52位来存储浮点数的有效数字,11位存储指数,1位存储正负号。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-28 20:52:43 | 显示全部楼层
kylin121380 发表于 2020-9-28 20:16
.x x是多少就保留多少位

那为什么会这样呢?

>>> d='{:.8}'.format(27.888,'GB')
>>> d
'27.888'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-28 20:54:50 | 显示全部楼层
kogawananari 发表于 2020-9-28 20:44
Python 中使用双精度浮点数来存储小数。在 Python 使用的 IEEE 754 标准(52M/11E/1S)中,8字节64位存储 ...

可是27.888000000000001676880856393836438655853271484375不是52位有效数字啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 21:35:31 | 显示全部楼层
晴天团团团 发表于 2020-9-28 20:52
那为什么会这样呢?

>>> d='{:.8}'.format(27.888,'GB')

python默认提供17位小数精度,后面的就没有意义,27.888保留8位就是27.888,你保留888位之后的数字没有意义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 21:58:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-10-23 16:46 编辑

感觉好无语哟。自己给自己挖坑,然后还出不来了。。。

你的这些例子中,第三个最简单,最后再说,先说另外三个
在这几个例子中,前面只有一个填位符,而后面俩参数,所以第二个参数 'GB' 根本没用。
前面的填位符中都没有写 f ,所以不把后面的内容当成浮点数,仅仅是当成字符串,点后面的数字就是字符串的长度,但也不是把你所写的这个数字27.888当成字符串,而是把这个原数当成字符串。

第一个和第二个例子,之所以相等,是因为他们就是字符串啊,字符串每个字符一致,那么两个字符串就相等呗
先说第二个例子中,a和b为什么是这么多位。
27.888在python中是多少呢?
可以通过下面这个看看
>>> import decimal
>>> decimal.Decimal(27.888)
Decimal('27.888000000000001676880856393836438655853271484375')
>>> 
我们可以看出,他就是你所得到的那个a字符串中的内容。也就是说不管你写88还是888,他只有50位有效数字,因为原数内容就这么多
再说第一个例子,一个写的是6,一个写的是8,但是最后出来的都是五位有效数字 '27.888'。看上面得到的那个27.888的原数,前面几位有数字,从第七位开始为0,一直到第16位都为0,第17位小于5,所以这里你写5~16位得到的结果都一样,都是'27.888'

上面的明白了之后,第四个例子,就好讲了
第四个例子中,前两条,一位或两位有效数字,因为整数部分有两位,就只能写成这种科学计数法了。第三条,三位有效数字,就直接四舍五入了

最后说一下第三个例子。前面也是一个占位符,后面的参数是 '27.888''GB' 这个中间没有逗号,所以这是一个拼接字符串,是一个参数,相当于 '27.888GB'。因为后面的参数就是个字符串,那就简单了前面要几位,就给几个字符,但最多只有八个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 21:54:09 | 显示全部楼层
sunrise085 发表于 2020-9-28 21:58
感觉好无语哟。自己给自己挖坑,然后还出不来了。。。

你的这些例子中,第三个最简单,最后再说,先说另 ...

也就是说,(1)中,因为无论保留六位还是八位,27.888后面都是0,所以不显示0?
(2)中,有效数字只有50位,所以至多显示50位?
(3)中,因为它是一个字符串,所以当.x的x大于字符串本身的长度,就只显示字符串本身的长度?
(4)中,当.x的x大于数字整数部分的长度,就不用科学计数法?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 22:03:18 | 显示全部楼层
kylin121380 发表于 2020-9-28 21:35
python默认提供17位小数精度,后面的就没有意义,27.888保留8位就是27.888,你保留888位之后的数字没有意 ...

那为什么保留八位小数不是27.88800000?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 11:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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