【问题标题】:Float64 fields having floating point errors on Pandas [Python]在 Pandas [Python] 上具有浮点错误的 Float64 字段
【发布时间】:2017-06-09 10:27:08
【问题描述】:

我知道 Python 在使用普通类型时会出现浮点错误。这就是我改用 Pandas 的原因。

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

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

【问题讨论】:

  • 这就是浮点数的本质。这只是一个表示,所以你可以忽略它。为什么这对你来说是个问题?顺便说一句:print(0.1 + 0.2)
  • @MaxU 我明白了。这就是为什么我会尝试通过执行 0.05 * 100 = 5 来解决,将这 4 相加并得到 20。但我的问题是系统看到 20.00000..001,甚至四舍五入似乎也不起作用。

标签: python pandas floating-point precision


【解决方案1】:

好的,这样就可以了:

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

但这不是:

In [643]: (((df * 1000000).round(0))).sum() * 1000000
Out[643]:
a    2.000000e+11
dtype: float64

因此,您必须在 Panda 数组中进行所有计算,否则可能会造成破坏。

【讨论】:

    【解决方案2】:

    “我得到了总和不正确的同一点!”根据您对不正确的定义,几乎所有浮点运算都是不正确的。只有 2 的幂才能用浮点数完美表示,其他所有内容都有大约 15-17 个十进制数字的舍入误差(对于双精度浮点数)。在显示这些值时,某些应用程序只是比其他应用程序更好地隐藏此错误。 对于您正在使用的数据而言,这种精度已经绰绰有余了。

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

    【讨论】:

    • “只有 2 的幂”有点低估了它:大约有 180 亿个实数可以用通常的 IEEE 754 binary64 浮点格式精确表示。在这 180 亿个中,只有 2098 个是 2 的幂。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 2018-02-24
    • 2019-08-22
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多