>>> 32.343%1
0.3430000000000035
>>> 0.343%1
0.343
>>> 0.343%1 == 32.343%1
False
额,为什么0.343%1 != 32.343%1???
>>> 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.343
和32.343
的十进制小数部分是一样的,但是转化成二进制,两个数字没有一点相似的部分追根究底,请Google IEEE754