何故ですか?
結果を明示的に整数に変換するため、小数点以下はすべて削除されます。
second = int(round(x - (hour * 3600 + minute * 60), 1))
どうすれば修正できますか?
seconds結果を整数に変換しないでください:
second = round(x - (hour * 3600 + minute * 60), 1)
hourandのminute計算を丸めるべきではありません。代わりに結果をフロアリングする必要があります。int()自体がそれを行います。round()これら 2 つの値の呼び出しをドロップします。フロア除算演算子は、除算結果//を呼び出すのと同じ結果を提供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'
浮動小数点値を 10 進数 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) と残りの秒数を返します。同じ関数を分数に再度適用すると、残りの時間と分が得られます。