四舍五入的问题

时间:2017-01-11 04:47:58

标签: python pandas decimal

我是python的新手并且遇到了这个问题。 我必须从数据框中获取以下信息并提供其平均值[答案是假设返回单个数字]

以下是数据框中的列:

   Country
China                  93.0
United States         286.0
Japan                 149.0
United Kingdom        124.0
Russian Federation    214.0
Canada                296.0
Germany               165.0
India                  26.0
France                166.0
South Korea           221.0
Italy                 109.0
Spain                 106.0
Iran                  119.0
Australia             231.0
Brazil                 59.0
Name: Energy Supply per Capita, dtype: float64

现在使用以下内容:

Per_capita = Top15.loc[:,['Energy Supply per Capita']].mean()
Per_capita.iloc[0]

我明白了:

157.59999999999999

所以我尝试使用round函数:

Per_capita = Per_capita.round(decimals = 1)

如果我有任何小数位,我仍然得到相同的输出。它只会在我将小数位数设为0时改变,并且它给出了158,我假设它不是他们正在寻找的答案。

如果我不使用iloc函数,我会得到一个很好的1位十进制答案

Energy Supply per Capita    157.6

我想获得上述

的2位十进制答案

3 个答案:

答案 0 :(得分:2)

这不是四舍五入的问题;这是一个展示问题。数字157.6在双精度算术中并不完全可以表示,其代表性的双精度数小于157.6。 Python浮点数和NumPy浮点数在控制台中显示数字时如何处理此问题有所不同。例如:

x = 157.6
df = pd.DataFrame({'a': [x]})
y = df.iloc[0,0]

现在,如果您在控制台中键入x,则会获得157.6,但如果您键入y,则会获得157.59999999999999。然而,x == y是真的。这笔交易是什么?

不同的类型,全部:x是Python float,y是NumPy float,因为它来自数据帧(pandas使用NumPy)。因此,化妆品在外观上的差异。数字是相同的,没有什么可以进行四舍五入。

如何避免丑陋的9s:使用print(y),或在您的示例中使用print(Per_capita.iloc[0])。 print函数将以漂亮的方式显示浮点数,无论是NumPy浮点数还是Python浮点数。

答案 1 :(得分:0)

我相信你正在解决课程作业。如果答案应该是没有任何小数的数字,请使用以下代码:

Per_capita = int(Top15.mean())

如果您需要使用157.6的答案:

Per_capita = Top15.mean()

答案 2 :(得分:0)

这可能与数据157.59999999999999

有关

举例如下:

B = 157.59999999999999

print np.round(b,decimals = 0)

print np.round(b,decimals = 1)

print np.round(b,decimals = 4)

  
    

158.0

         

157.6

         

157.6

  

如果更改b的值:

B = 157.5932321231341231

print np.round(b,decimals = 0)

print np.round(b,decimals = 1)

print np.round(b,decimals = 2)

  
    

158.0

         

157.6

         

157.59

  

这次是有效的,所以这可能取决于数据,.999999

对于数据,小数的结果= 2,3,4,所有结果都是相同的。