不是特定于Python的实现,但应该适用于任何浮点数到十进制字符串函数。
浮点数本质上是一个二进制数,但采用科学记数法,具有固定的有效数字限制。
具有未与基础共享的素数因子的任何数的倒数将始终导致重复点点表示。例如,1/7有一个素数因子7,它不与10共享,因此具有重复的十进制表示,对于具有素数因子2和5的1/10,情况也是如此,后者不与2共享;这意味着0.1点不能用点数后的有限位数来精确表示。
由于0.1没有精确的表示,因此将近似值转换为小数点字符串的函数通常会尝试近似某些值,这样它们就不会得到不直观的结果,如0.1000000000004121。
由于浮点是科学记数法,因此乘以基数幂只会影响数字的指数部分。例如,1.231e + 2 * 100 = 1.231e + 4表示十进制表示法,同样,1.00101010e11 * 100 = 1.00101010e101表示二进制表示法。如果我乘以基数的非幂,有效数字也会受到影响。例如1.2e1 * 3 = 3.6e1
根据所使用的算法,它可能会尝试仅基于有效数字来猜测常见小数。 0.1和0.4都具有相同的二进制有效数字,因为它们的浮点数基本上分别为(8/5)(2 ^ -4)和(8/5)(2 ^ -6) 。如果算法将8/5 sigfig模式识别为十进制1.6,那么它将在0.1,0.2,0.4,0.8等上工作。它也可能具有其他组合的魔法sigfig模式,例如float 3除以float 10和统计上可能通过除以10形成的其他魔法模式。
在3 * 0.1的情况下,最后几个有效数字可能与将浮点数3除以浮点数10不同,导致算法无法识别0.3常数的幻数,具体取决于其对精度损失的容忍度
有趣的是,有许多不同的十进制数共享相同的最接近的近似二进制分数。例如,数字0.1和0.10000000000000001和0.1000000000000000055511151231257827021181583404541015625都近似为3602879701896397/2 ** 55.由于所有这些十进制值共享相同的近似值,因此可以显示其中任何一个,同时仍保留不变eval(repr(x) )== x。
如果浮点x(0.3)不完全等于浮点数y(0.1 * 3),则精度损失没有容差,则repr(x)不完全等于repr(y)。