大熊猫四舍五入,这是一个错误吗?

时间:2016-05-17 15:52:52

标签: python pandas rounding

这是一个错误吗?当我以4位小数舍入时,实际上会返回不同的结果。

import pandas as pd
pd.set_option('precision', 10)

pd.DataFrame([[1.446450001],[1.44645]]).round(4)

结果

    0
0   1.4465
1   1.4464

3 个答案:

答案 0 :(得分:6)

这不是一个错误 - 相反,它是一个没有记录的怪癖。

DataFrame.round在引擎盖下使用numpy.around,其中:

  

对于正好在舍入小数值之间的值,Numpy会舍入到最接近的偶数值。因此1.5和2.5轮到2.0,-0.5和0.5轮到0.0等等。

http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.around.html

更多读物@维基百科:https://en.wikipedia.org/wiki/Rounding#Round_half_to_even

答案 1 :(得分:2)

有两种不同的舍入策略

  • 第一轮就像你可能在学校里学到的那样,在一个间隔的正确一半(以5结尾)的值向上舍入

  • 第二轮到下一个甚至

第一种策略有副作用,你的意思是积极的偏见,因为中心总是调高。这是由第二个策略修正的,任意决定四舍五入到下一个偶数值。

Pandas选择使用实施第二种策略的numpy.around

答案 2 :(得分:0)

您可以使用以下功能在pandas或python中进行普通舍入:

import numpy

def round_normal(n, decimals):
    # multiply the decimal by 10 to the number of decimals you want to round to
    multiplicand = 10 ** decimals

    # add 0.5 so that taking the floor will get you the right number when you 
    # divide by the multiplicand

    # e.g. 3.0449 to 2.d.p -> 304.49 + 0.5 = 304.59 -> floor(304.59) / 100 = 3.04
    # e.g. 3.045 to 2.d.p -> 304.5 + 0.5 = 305 -> floor(305) / 100 = 3.05
    rounded_n = numpy.floor(n * multiplicand + 0.5) / multiplicand
    return rounded_n