Float64 Pandas上有浮点错误的字段[Python]

2024-04-26 15:15:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道Python在使用普通类型时有浮点错误。这就是为什么我用熊猫代替。在

我突然开始对输入的数据(不是计算)产生一些问题,无法解释以下行为:

In [600]: df = pd.DataFrame([[0.05], [0.05], [0.05], [0.05]], columns = ['a'])

In [601]: df.dtypes
Out[601]:
a    float64
dtype: object

In [602]: df['a'].sum()
Out[602]: 0.20000000000000001

In [603]: df['a'].round(2).sum()
Out[603]: 0.20000000000000001

In [604]: (df['a'] * 1000000).round(0).sum()
Out[604]: 200000.0

In [605]: (df['a'] * 1000000).round(0).sum() / 1000000
Out[605]: 0.20000000000000001

希望有人能帮我解决这个问题,或者弄清楚如何正确地求和0.2(或者我不介意结果是20还是2000,但正如你所看到的,当我除以时,我得到了和不正确的相同点!)。在

(要运行我的代码,请记住要做import pandas as pd


Tags: columns数据in类型dataframedf错误out
2条回答

“我也得出了同样的结论,那就是总数不正确!”根据不正确的定义,几乎所有的浮点运算都是不正确的。只有2的幂次才能用浮点完美地表示,其他所有的四舍五入误差约为15-17个十进制数字(对于双精度浮点)。一些应用程序只是在显示这些值时比其他应用程序更好地隐藏此错误。 对于您正在使用的数据来说,这种精度远远不够。在

如果您对难看的输出感到困扰,那么可以执行"{:.1f}".format(value)将输出字符串四舍五入到小数点后1位,或者"{:g}".format(value)来自动选择一个合理的位数来显示。在

好的,这样就行了:

In [642]: (((df * 1000000).round(0)) / 1000000).sum()
Out[642]:
a    0.2
dtype: float64

但这并不是:

^{pr2}$

所以你必须在Panda数组内进行所有的计算,否则就要冒着崩溃的风险。在

相关问题 更多 >