为何df.astype('int')转换pandas浮点数时数值会异常变化?
为什么57.99999999999999转int后是57而非58?
这个现象本质是浮点数二进制存储的精度限制加上pandas截断式转换逻辑共同导致的:
1. 浮点数的二进制存储局限
计算机无法精确表示所有十进制小数,因为浮点数采用二进制编码。你输入的57.99999999999999和57.999999999999996,在二进制存储中实际是略小于58的数值——它们的十进制写法只是近似,真实存储值并没有达到58。
而57.999999999999997刚好突破了这个精度阈值,被二进制浮点数编码为精确等于58的数值。
你可以用Python原生float验证:
>>> 57.99999999999999 < 58 True >>> 57.999999999999997 == 58 True
2. pandas astype('int')的转换逻辑
pandas的astype('int')采用截断式转换:直接丢弃小数部分,只保留整数位,完全不做四舍五入。
所以:
- 当存储值略小于58时,截断小数后得到57
- 当存储值等于58时,截断后自然得到58
这就是为什么同样看似接近58的数值,转换结果却不同。
内容的提问来源于stack exchange,提问作者David Siret Marqués
相关产品推荐
相关产品推荐

