如何避免np.cumsum中的错误小数?

时间:2018-02-17 23:37:27

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

我有以下列表

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]

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

1 个答案:

答案 0 :(得分:2)

了解浮点数不存储在十进制基数格式中非常重要。

因此,您必须清楚为什么要删除"额外的小数位数"你看到了:

  1. 更改格式以使数字看起来更漂亮/一致。
  2. 使用精确度,就像执行基数为10的算术一样。
  3. 如果答案是(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]