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