何故ですか?
結果を明示的に整数に変換するため、小数点以下はすべて削除されます。
second = int(round(x - (hour * 3600 + minute * 60), 1))
どうすれば修正できますか?
seconds
結果を整数に変換しないでください:
second = round(x - (hour * 3600 + minute * 60), 1)
hour
andの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
削除し、次に残りを削除することですべてを削除します。.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
) と残りの秒数を返します。同じ関数を分数に再度適用すると、残りの時間と分が得られます。