【问题标题】:How to rount a number to tenth inside an 'int' function?如何在“int”函数中将数字四舍五入到十分之一?
【发布时间】:2013-09-14 17:15:00
【问题描述】:

这是我的convert_seconds 函数:

def convert_seconds(x):
    hour = int(round(x / 3600))
    minute = int(round(x / 60 - hour * 60))
    second = int(round(x - (hour * 3600 + minute * 60), 1))
    return str(hour) + ' hours, ' + str(minute) + ' minutes, ' + str(second) +' seconds'

当我运行我的函数时:

>>>print convert_seconds(7261.7)
2 hours, 1 minute, 1 seconds

它打印出“1 秒”而不是“1.7 秒”

这是为什么呢? 我该如何解决?

注意:我需要的输出是:

>>>print convert_seconds(7261.7)
2 hours, 1 minute, 1.7 seconds

谢谢。

【问题讨论】:

    标签: python python-2.7 int rounding


    【解决方案1】:

    为什么会这样?

    因为您明确地将结果转换为整数,删除了小数点以外的任何内容:

    second = int(round(x - (hour * 3600 + minute * 60), 1))
    

    我该如何解决这个问题?

    不要将seconds 结果转为整数:

    second = round(x - (hour * 3600 + minute * 60), 1)
    

    您不应该对 hourminute 计算进行四舍五入;你应该把结果放在地板上; int() 自己会为您做到这一点。放弃对这两个值的 round() 调用。 // 取整运算符会得到与在除法结果上调用 int() 相同的结果,无需显式取整或取整。

    您可以使用格式化操作将值仅显示为小数:

    >>> def convert_seconds(x):
    ...     hour = x // 3600
    ...     minute = x // 60 - hour * 60
    ...     second = x - (hour * 3600 + minute * 60)
    ...     return '{:.0f} hours, {:.0f} minutes, {:.1f} seconds'.format(hour, minute, second)
    ... 
    >>> convert_seconds(7261.7)
    '2 hours, 1 minutes, 1.7 seconds'
    

    要将浮点值四舍五入到小数点后 1 位,但 删除 .0,如果这是四舍五入的结果,您需要显式地将 .0 串起来:

    >>> def convert_seconds(x):
    ...     hour = x // 3600
    ...     minute = x // 60 - hour * 60
    ...     second = x - (hour * 3600 + minute * 60)
    ...     second_formatted = format(second, '.1f').rstrip('0').rstrip('.')
    ...     return '{:.0f} hours, {:.0f} minutes, {} seconds'.format(hour, minute, second_formatted)
    ... 
    >>> convert_seconds(7261.7)
    '2 hours, 1 minutes, 1.7 seconds'
    >>> convert_seconds(7261)
    '2 hours, 1 minutes, 1 seconds'
    

    表达式format(second, '.1f').rstrip('0').rstrip('.') 格式化seconds 值,但删除任何.0,首先剥离0,然后剥离剩余的.

    您可能希望使用divmod() function:而不是除法和减法:

    def convert_seconds(x):
        minutes, seconds = divmod(x, 60)
        hours, minutes = divmod(minutes, 60)
        second_formatted = format(seconds, '.1f').rstrip('0').rstrip('.')
        return '{:.0f} hours, {:.0f} minutes, {} seconds'.format(hours, minutes, second_formatted)
    

    divmod() 函数返回商余数的结果; divmod(x, 60) 返回分钟数(x 中 60 的次数)和剩余的秒数。对分钟数再次应用相同的函数,您将得到几小时零一分钟。

    【讨论】:

    • 是的,但是“convert_seconds(7325)”呢,那么秒数将是 5.0 而不是 5
    • 我不希望它是浮动的(5.0),但我也希望它是圆形的(1.666666 ~ 1.7,而不是 2)。我该怎么做?
    【解决方案2】:

    我认为您在这里也有其他问题 ;-) 例如,

    >>> print convert_seconds(3500.0)
    1 hours, -2 minutes, 20 seconds
    

    通常,当您应该截断时,您通常会进行四舍五入。这更容易处理整数,因此以下将参数分为整数和小数部分,大多数情况下都使用整数,并将小数部分放回末尾(但仅在需要时 - 如果它不是 0.0):

    def convert_seconds(x):
        from math import modf
        frac, whole = modf(x)
        hours, leftover = divmod(int(whole), 3600)
        minutes, seconds = divmod(leftover, 60)
        if frac:
            seconds += frac  # change to float to get fraction
        return "{} hours, {} minutes, {} seconds".format(
            hours, minutes, seconds)
    
    for case in 3500.0, 7261.7, 7325:
        print case, "->", convert_seconds(case)
    

    打印出来的:

    3500.0 -> 0 hours, 58 minutes, 20 seconds
    7261.7 -> 2 hours, 1 minutes, 1.7 seconds
    7325 -> 2 hours, 2 minutes, 5 seconds
    

    【讨论】:

      【解决方案3】:

      当您将 float 类型转换为 int 类型时,它会丢弃所有十进制值,并在它下面为您提供准系统整数。

      试试这个:

      def convert_seconds(x):
          hour = int(round(x / 3600))
          minute = int(round(x / 60 - hour * 60))
          second = float(round(x - (hour * 3600 + minute * 60), 1))
          return str(hour) + ' hours, ' + str(minute) + ' minutes, ' + str(second) +' seconds'
      
      print(convert_seconds(7261.7))
      

      您在询问的地方添加了一条评论,“是的,但是“convert_seconds(7325)”呢,那么秒数将是 5.0 而不是 5”

      您可以执行类似的操作来解决此问题。完成第二次分配后:

      second = float(round(x - (hour * 3600 + minute * 60), 1))
      

      这样做:

      second == int(second) if second == int(second) else second
      

      “我不希望它是浮点数(5.0),但我希望它是四舍五入到(1.666666 ~ 1.7,而不是 2)。我该怎么做?”

      你已经这样做了! round 的第二个参数是 1,它会自动将其四舍五入到小数点后一位。尝试执行convert_seconds(7261.6666),此代码将起作用。

      【讨论】:

      • 或者你可以使用{:g}
      猜你喜欢
      • 2011-11-06
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多