在Python 2.7中,一个float的repr返回最接近十七位数的十进制数;这足以精确地识别每个可能的IEEE浮点值.浮点数的str类似地工作,除了它将结果限制为12位数;对于大多数目的,这是一个更合理的结果,并且使您免受二进制和十进制表示之间的微小差异.
Python 2演示: http://ideone.com/OKJtxv
print str(1.4*1.5) 2.1 print repr(1.4*1.5) 2.0999999999999996
在Python 3.2中,出现str和repr返回相同的事情.
Python 3演示: http://ideone.com/oAKRsb
print(str(1.4*1.5)) 2.0999999999999996 print(repr(1.4*1.5)) 2.0999999999999996
是否有描述变更的PEP或某人负责的其他声明?
不,没有PEP.错误跟踪器中有一个 issue ,在Python开发人员邮件列表中有一个 associated discussion
.虽然我负责提出和实施变革,但我不能说这是我的想法:它是在EuroPython 2010与Guido对话时产生的.
一些更多的细节:如评论中已经提到的,Python 3.1为float的string repr引入了一个新的算法(后来被转载到Python 2系列,这样它也出现在Python 2.7中).作为这种新算法的结果,在提示符下键入的“短”十进制数具有相应的较短的表示.这消除了str和repr之间的差异的现有原因之一,并且使得可以对str和repr使用相同的算法.所以对于Python 3.2,按照上面的讨论,str和repr是相同的.至于为什么:它使语言变得更小更干净,并且当输出字符串时,它会删除12位数字的相当随意的选择. (在2.7之前的Python版本中用于repr的17位数字的选择远不是任意的,顺便说一下:两个不同的IEEE 754 binary64浮点数将在转换为十进制时具有不同的表示,17位有效数字,17是最小的整数与此属性.)
除了简单,还有一些不那么明显的好处.过去令用户混淆的repr对str区别的一个方面是repr自动被用于容器.所以例如在Python 2.7中:
> x = 1.4 * 1.5 > print x 2.1 > print [x] [2.0999999999999996]
我确定至少有一个StackOverflow问题询问这个现象: here is one such 和 another 更近一个.通过Python 3.2中引入的简化,我们得到:
> x = 1.4 * 1.5 > print(x) 2.0999999999999996 > print([x]) [2.0999999999999996]
这是至少更一致的.
如果您确实希望能够隐藏不精确,正确的方法仍然保持不变:使用字符串格式来精确控制输出格式.
> print("{:.12g}".format(x)) 2.1
我希望能够解释这一变化背后的一些原因.我不会认为这是普遍有益的:正如你所指出的那样,旧的str具有隐藏不精确的方便的副作用.但是在我看来(当然我有偏见),它确实有助于消除语言中的一些惊喜.
总结
以上所述是小编给大家介绍的为什么str(float)在Python 3中比Python 2返回更多的数字,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
python,str,float
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。