Pandas小数四舍五入失效求助:结果与预期不符
为啥Pandas 0.20.3里round(9)给出的结果和你预期不一样?
嘿,这个问题我之前也碰到过,核心原因其实是二进制浮点数的精度限制在搞鬼!你输入的0.0094909865这个十进制小数,根本没法在二进制浮点数系统里精确存储,实际存在内存里的是一个比它略小的值,这直接导致了四舍五入时的偏差。
具体来说是怎么回事?
计算机默认用float64(双精度浮点数)存小数,但很多十进制小数转成二进制后是无限循环的,只能存近似值。比如你输入的0.0094909865,实际存的是这个:
print(repr(0.0094909865)) # 输出:0.009490986499999999
看到没?这个值其实是0.009490986499999999,比你想要的0.0094909865小了一丢丢。当你调用round(9)时,是对这个近似值做四舍五入:第9位小数是6,后面跟着的是499...,不够触发进位的条件,结果自然就变成了0.009490986,而不是你预期的0.009490987。
不信的话你自己测测
不用Pandas,直接在Python里测单个浮点数的四舍五入,结果一模一样:
print(round(0.0094909865, 9)) # 输出:0.009490986
这说明问题不是Pandas的锅,是底层浮点数表示的固有特性,而0.20.3版本的Pandas直接用了这个底层逻辑。
那怎么得到你想要的结果?
如果需要精确的十进制四舍五入,得用Python的decimal模块,它专门处理精确的十进制运算:
from decimal import Decimal, ROUND_HALF_UP num = Decimal('0.0094909865') rounded_num = num.quantize(Decimal('0.000000001'), rounding=ROUND_HALF_UP) print(rounded_num) # 输出:0.009490987
在Pandas里,你也可以把数据转成Decimal类型再做四舍五入,就能避开浮点数的精度坑了。
内容的提问来源于stack exchange,提问作者Gayathri
相关产品推荐
相关产品推荐

