因为二进制浮点数不能解决这个问题。
先看一个现象,和round 无关的:
>>>defshow(x):..."""打印一个数,20 位精度"""...print('{:.20f}'.format(x))...>>>show(1.5)1.50000000000000000000>>>show(1.25)1.25000000000000000000>>>show(1.245)1.24500000000000010658>>>show(1.45)1.44999999999999995559>>>show(1.415)1.41500000000000003553
从数学上看,一个既约分数(有理数)n/d 要表示为 B 进制数,如果 d 的所有素因子都整除 B,就说明存在一个整数 k,使得分母 d 整除 B^k——比如 q * d = B^k,于是此时有 n/d = n / (B^k / q) = nq / B^k,也就是说 n/d 可以使用至多 k 位数的 B 进制小数有限表示。
反之,也容易证明,如果 d 有素因子不能整数 B,那么就不存在上面的 k,也就是说有理数 n/d 不可能由有限位数的 B 进制数表示。——也就是说会出现循环小数。
对于 10 进制数,所有分母只有素因子 2 和5的有理数,都能表示为有限小数。比如 1/2 是0.5,1/4 是0.25,1/5 是0.2,3/8 是0.375,都是有限的。
而对于 2 进制数,分母里面只有素因子 2 的有理数,才能表示为有限小数。所以 1/2 是0.1,1/4 是0.01,3/8 是0.011。但1/5 就不能用有限二进制数表示了,是个循环小数 0.0011 0011 0011……。
(什么,你问无理数?小学生都知道无理数是无限不循环小数。)
现在:
计算机的浮点数是用小数表示的。浮点数就是科学计数法,指数部分是个整数,尾数部分是个小数。计算机的存储是有限的,所以只能使用有限位数的小数表示。计算机硬件通常是用二进制运算的。
具体到 Python 的float,C/C++ 的float/double,都是有限长度的、二进制、浮点数。准确地说,是这个:IE