1

这是我的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

谢谢。

4

3 回答 3

4

这是为什么?

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

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

我该如何解决?

不要将seconds结果转换为整数:

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

hour你不应该对和minute计算进行四舍五入;你应该把结果放在地板上;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删除任何值。.00.

您可能需要使用以下divmod()函数,而不是除法和减法:

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)返回分钟数(60 适合的次数x),以及剩余的秒数。对分钟数再次应用相同的函数,您将得到几小时零一分钟的剩余时间。

于 2013-09-14T17:16:54.510 回答
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
于 2013-09-14T17:39:42.297 回答
0

当您将 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),此代码将起作用。

于 2013-09-14T17:19:11.190 回答