如何解决为什么Pandas Dataframe和Python具有奇怪的浮点精度十进制值分配,从而影响舍入?
希望任何人都可以帮助解释以下行为及其解决方法
我有一个这样的DataFrame:
l = [[1,50,3,4.003],[1,4,5.002],[2,10,5.003],2,5.004]]
df = pd.DataFrame(l,columns=["a","b","c","d"])
df # Output:
a b c d
0 1 50 3 4.003
1 1 50 4 5.002
2 2 10 3 5.003
3 2 50 2 5.004
现在,如果我对列“ d”的row1 + row2做一个简单的求和,我应该期望得到9.005
的结果,对吗?
错了,我得到了9.004999999999999
,这就是我要做的:
sum = df.loc[0]["d"] + df.loc[1]["d"]
sum # Output:
9.004999999999999
这会影响到求和后四舍五入到小数点后两位的结果。
我在Internet上进行了一些研究,这可能与float64数据类型上使用的字节数有关,但是有什么方法可以克服此问题?
通过常规python变量尝试相同操作时,它会执行相同的操作:
d0 = 4.003
d1 = 5.002
d0 + d1 # Output:
9.004999999999999
挑战在于,如果我需要将结果四舍五入到两位小数,我想获得9.01
而不是9.0
round((d0 + d1),2) # Output:
9.0 # It should have been 9.01
因此,当我们有成千上万甚至几百万条记录时,为了避免这个问题,必须在求和和舍入之前确定哪些值具有点精度误差?这将是非常不切实际的,还有其他建议吗?
解决方法
关于第二个示例:您需要使用Decimal
包来避免舍入错误并获得预期的结果。
from decimal import Decimal
d0 = Decimal('4.003')
d1 = Decimal('5.002')
print(d0 + d1)
print(round(d0 + d1,2))
9.005
9.00
本文可能会有所帮助: https://www.itu.dk/~sestoft/bachelor/IEEE754_article.pdf
Kahan求和算法(以最小化舍入误差)可能也很重要: https://en.wikipedia.org/wiki/Kahan_summation_algorithm
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。