这是我的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
感谢。
答案 0 :(得分: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
值,但首先删除.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)
返回分钟数(60次适合x
的次数),余数为秒。在分钟数上再次应用相同的功能,你会得到几小时和一分钟的剩余时间。
答案 1 :(得分: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
答案 2 :(得分:0)
当你将一个浮点类型变成一个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)
,此代码将有效。