为了账号安全,请及时绑定邮箱和手机立即绑定

python % 的问题

python % 的问题

阿波罗的战车 2019-04-13 08:36:28
>>>32.343%10.3430000000000035>>>0.343%10.343>>>0.343%1==32.343%1False额,为什么0.343%1!=32.343%1???
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

一个是0.3430000000000035,一个是0.343,当然不相等
至于为啥是0.3430000000000035
这个涉及到浮点数的精度问题,计算机中二进制无法精确表示绝大多数有限不循环小数,所以虽然你看到0.343和32.343的十进制小数部分是一样的,但是转化成二进制,两个数字没有一点相似的部分
追根究底,请GoogleIEEE754
                            
查看完整回答
反对 回复 2019-04-13
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

如果说原因的话,就是这个数字无法表示为一个二进制有限小数。原理是这样的:将一个十进制最简分数x/y化为一个n进制小数z,令集合A为y的所有因数的集合,集合B为n的所有质因数的集合,那么z为有限小数的充要条件是A为B的子集。举例说明:对于一个最简分数,如果其分母的所有因数中,没有除了2和5以外的其他任何数,那么它就能用一个十进制有限小数来表示。例如1/4可以表示为0.25,1/10可以表示为0.1,1/20可以表示为0.05等等。同理,对于一个最简分数,如果其分母的所有因数中,没有除了2以外的其他任何数,那么它就能用一个二进制有限小数来表示。例如1/2可以表示为0.1,1/4可以表示为0.01,1/8可以表示为0.001,但是1/10就无法这样表示,只能表示为0.0001100110011...如果说解决方法的话,推荐使用Decimal(),效果如下:>>>Decimal(32.343)Decimal('32.3430000000000035')>>>Decimal('32.343')Decimal('32.343')
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 552 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信