【问题标题】:How to avoid bad decimals in np.cumsum? [duplicate]如何避免 np.cumsum 中的小数错误? [复制]
【发布时间】:2018-02-17 23:37:27
【问题描述】:

我有以下列表

alist = [0.141, 0.29, 0.585, 0.547, 0.233]

我找到了累积和

np.cumsum(alist)
array([ 0.141,  0.431,  1.016,  1.563,  1.796])

当我将此数组转换为列表时,会显示一些十进制值。如何避免这些小数?

list(np.cumsum(alist))
[0.14099999999999999,
 0.43099999999999994,
 1.016,
 1.5630000000000002,
 1.7960000000000003]

这可能是重复的,但我找不到答案。

【问题讨论】:

  • 请注意,这与cumsum 或数组与列表没有太大关系,只是它们的打印方式不同。只需输入 0.141 + 0.29 即可查看数字本身。

标签: python python-2.7 numpy floating-point precision


【解决方案1】:

了解浮点数不以 10 进制十进制格式存储是很重要的。

因此,您必须清楚为什么要删除您看到的“多余的小数位”:

  1. 更改格式以使数字看起来更漂亮/一致。
  2. 像执行以 10 为底的算术一样精确地工作。

如果答案是 (1),则使用 np.round

如果答案是(2),那么使用python的decimal模块。

下面的例子演示了np.round 确实没有改变浮动的底层表示。

import numpy as np

alist = [0.141, 0.29, 0.585, 0.547, 0.233]

lst = np.round(np.cumsum(alist), decimals=3)
print(lst)
# [ 0.141  0.431  1.016  1.563  1.796]

np.set_printoptions(precision=20)
print(lst)
# [ 0.14099999999999998646  0.43099999999999999423  1.01600000000000001421
#   1.56299999999999994493  1.79600000000000004086]

np.set_printoptions(precision=3)
print(lst)
# [ 0.141  0.431  1.016  1.563  1.796]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    相关资源
    最近更新 更多