【问题标题】:How to Roundoff 0.5 to nearest integer in python?如何在python中将0.5四舍五入到最接近的整数?
【发布时间】:2021-03-27 13:24:20
【问题描述】:

我的输入如下所示:

Name Sep     Oct
Amy  833.33  833.33
Eve  20774.5  0

我的预期输出是:

Name Sep     Oct
Amy  833     833
Eve  20775   0

当我应用 np.ceil 将 0.5 舍入到最接近的整数时,我的输出变为:

Name Sep     Oct
Amy  834     834
Eve  20775   0

如何仅将np.ceil 应用于十进制大于或等于0.5 的值?或者有没有其他方法可以获得我想要的输出。

【问题讨论】:

标签: python pandas math decimal rounding


【解决方案1】:

您可以使用np.round 并转换为int

像这样:

int(np.round(833.33))

输出:

833

【讨论】:

    【解决方案2】:

    np.ceil() 总是向上舍入,而np.floor() 总是向下舍入。

    np.round() 很接近,但并不总是四舍五入为 *.5。正如@Mark Ransom 建议的那样,事实证明这种舍入不一致是by design(添加了重点):

    numpy.around(a, decimals=0, out=None)

    均匀四舍五入到给定的小数位数。

    例如,20774.5 向下舍入为 20774,而 20775.5 向上舍入为 20776。

    this SO post 中有一些解决方法。这是applymap() 其中一种解决方法的一种方法:

    df[['Sep', 'Oct']] = df[['Sep', 'Oct']].applymap(
        lambda x: np.ceil(x) if float(x) % 1 >= 0.5 else np.round(x))
    
    #   Name      Sep    Oct
    # 0  Amy    833.0  833.0
    # 1  Eve  20775.0    0.0
    

    【讨论】:

    • 我已经尝试了上述方法,但我的号码仍然是 20774.0 而不是 20775
    • 我认为这只是浮点精度的偶然产物之一。见:Is floating point math broken?
    • @tdy 它也可以是四舍五入模式。如果不将数字打印到至少 17 位,就很难分辨。
    • @MarkRansom 好点,确实如此。更新以反映这一点
    • @Akshayashiva 事实证明这种舍入不一致实际上是由于“银行家舍入”并且是设计使然(不仅仅是浮点工件)。我更新了答案以显示恢复“学校舍入”的解决方法
    【解决方案3】:

    我通过应用以下查询修复了我的输出:

    df['Sep'][(df['Sep']%1) >= 0.5] = df['Sep'].apply(np.ceil)
    

    【讨论】:

      【解决方案4】:
      
      inpt_strg = '''
      
      Name Sep Oct
      Amy 833.33 833.33
      Eve 20774.5 0
      
      '''
      s_lst = inpt_strg.splitlines()
      n_lst = [list(str.split(" ")) for str in s_lst]
      
      def fl(i):
       try: return float (i)
       except ValueError: return i
      
      def rd(i):
        if isinstance(i, float):
          if (abs(i)%1)*10>=5:return int (i) + 1
          else: return int (i)
        else: return i
      
      r_lst = [[rd(fl(i)) for i in sub] for sub in n_lst]
      
      from tabulate import tabulate
      print(tabulate(r_lst,tablefmt='plain'))
      
      

      输出:-

      Name  Sep    Oct
      Amy   833    833
      Eve   20775  0
      

      【讨论】:

        猜你喜欢
        • 2020-04-01
        • 1970-01-01
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-20
        • 2012-01-29
        • 1970-01-01
        相关资源
        最近更新 更多