这是为什么?
因为您明确地将结果转换为整数,删除了小数点以外的任何内容:
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()
函数,而不是除法和减法:
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
),以及剩余的秒数。对分钟数再次应用相同的函数,您将得到几小时零一分钟的剩余时间。