如何在'int'函数中将数字舍入到第十?

时间:2013-09-14 17:15:00

标签: python python-2.7 int rounding

这是我的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秒”而不是“1.7秒”

为什么? 我该如何解决这个问题?

注意:我需要的输出是:

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

感谢。

3 个答案:

答案 0 :(得分:4)

  

为什么?

因为您明确地将结果转换为整数,所以删除小数点以外的任何内容:

second = int(round(x - (hour * 3600 + minute * 60), 1))
  

我该如何解决?

不要将seconds结果转换为整数:

second = round(x - (hour * 3600 + minute * 60), 1)

您不应该围绕hourminute计算;你应该把结果放在地板上; 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)返回分钟数(60次适合x的次数),余数为秒。在分钟数上再次应用相同的功能,你会得到几小时和一分钟的剩余时间。

答案 1 :(得分: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

答案 2 :(得分:0)

当你将一个浮点类型变成一个int类型时,它将丢弃所有十进制值,并在它下面提供完整的整数。

试试这个:

def convert_seconds(x):
    hour = int(round(x / 3600))
    minute = int(round(x / 60 - hour * 60))
    second = float(round(x - (hour * 3600 + minute * 60), 1))
    return str(hour) + ' hours, ' + str(minute) + ' minutes, ' + str(second) +' seconds'

print(convert_seconds(7261.7))

你在你问的地方下面添加了一条评论,“是的但是怎么样”convert_seconds(7325)“,那么秒数将是5.0而不是5”

你可以做类似的事情来解决这个问题。在完成第二项任务后:

second = float(round(x - (hour * 3600 + minute * 60), 1))

这样做:

second == int(second) if second == int(second) else second

“我不希望它是浮动(5.0),但我希望它是圆形的(1.666666~1.7,而不是2)。我怎么能这样做?”

你已经这样做了!你round的第二个参数是1,它会自动将其舍入到一个小数位。尝试执行convert_seconds(7261.6666),此代码将有效。