首页 > python % 的问题

python % 的问题

>>> 32.343%1
0.3430000000000035
>>> 0.343%1
0.343
>>> 0.343%1 == 32.343%1
False

额,为什么0.343%1 != 32.343%1???


谢@xu_zhoufeng提醒,之前的描述不准确,已经修改。


如果说原因的话,就是这个数字无法表示为一个二进制有限小数。

原理是这样的:

将一个十进制最简分数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')

一个是0.3430000000000035,一个是0.343,当然不相等

至于为啥是0.3430000000000035

这个涉及到浮点数的精度问题,计算机中二进制无法精确表示绝大多数有限不循环小数,所以虽然你看到0.34332.343的十进制小数部分是一样的,但是转化成二进制,两个数字没有一点相似的部分

追根究底,请Google IEEE754

【热门文章】
【热门文章】