1

これが私の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.7秒」ではなく「1秒」と出力されます

何故ですか?どうすれば修正できますか?

注:必要な出力は次のとおりです。

>>>print convert_seconds(7261.7)
2 hours, 1 minute, 1.7 seconds

ありがとう。

4

3 に答える 3

4

何故ですか?

結果を明示的に整数に変換するため、小数点以下はすべて削除されます。

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) と残りの秒数を返します。同じ関数を分数に再度適用すると、残りの時間と分が得られます。

于 2013-09-14T17:16:54.510 に答える
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
于 2013-09-14T17:39:42.297 に答える