我一直在研究一个Python函数,将给定的秒数转换为可读的时间格式(HH:MM:SS)。该函数对于大多数测试用例都能正常工作,但对于一些特定的输入会失败。这是我编写的函数:
def make_readable(seconds):
if seconds < 60:
s1 = seconds
h1, m1 = (0,0)
return f"{str(h1).zfill(2)}:{str(m1).zfill(2)}:{str(s1).zfill(2)}"
else:
h0 = seconds / 3600
h1 = int(h0)
m0 = (h0 - int(h0)) * 60
m1 = int(m0)
s0 = (m0 - int(m0)) * 60
s1 = int(s0)
return f"{str(h1).zfill(2)}:{str(m1).zfill(2)}:{str(s1).zfill(2)}"
这是我正在运行的测试用例:
import codewars_test as test
@test.describe("Fixed Tests")
def fixed_tests():
@test.it('Basic Test Cases')
def basic_test_cases():
test.assert_equals(make_readable(0), "00:00:00")
test.assert_equals(make_readable(59), "00:00:59")
test.assert_equals(make_readable(60), "00:01:00")
test.assert_equals(make_readable(3599), "00:59:59")
test.assert_equals(make_readable(3600), "01:00:00")
test.assert_equals(make_readable(86399), "23:59:59")
test.assert_equals(make_readable(86400), "24:00:00")
test.assert_equals(make_readable(359999), "99:59:59")
大多数测试用例通过,但这两个失败:
test.assert_equals(make_readable(86399), "23:59:59")
test.assert_equals(make_readable(359999), "99:59:59")
这些测试用例的输出是:
'23:59:58' should equal '23:59:59'
'99:59:58' should equal '99:59:59'
I期望该函数为所有输入返回正确的时间格式。该函数在大多数测试用例中都能正常工作,但在输入为 86399 和 359999 秒的情况下会失败,返回的时间比预期少一秒。
我不确定为什么我的函数关闭了一秒在这些具体情况下。任何有关如何解决此问题的建议或见解将不胜感激。
提前致谢!
此问题源于使用浮点算术的精度问题。当执行类似
h0 = seconds / 3600
的操作时,结果是一个浮点数,而浮点数的表示方式可能并不总是精确的,尤其是在执行算术运算时。
以下是对的代码进行更正以解决此问题的替代方法,而无需依赖浮点算术:
def make_readable(seconds):
h1 = seconds // 3600
m1 = (seconds % 3600) // 60
s1 = seconds % 60
return f"{str(h1).zfill(2)}:{str(m1).zfill(2)}:{str(s1).zfill(2)}"
此代码执行以下操作:
- 计算小时数:
-
h1 = seconds // 3600
使用整除(//)来确定小时数,从而避免了浮点运算。 -
计算分钟数:
-
m1 = (seconds % 3600) // 60
首先使用模运算符(%)来获取剩余的秒数(在除以 3600 之后),然后将其除以 60 来计算分钟数。 -
计算秒数:
-
s1 = seconds % 60
使用模运算符(%)来获取剩余的秒数(在除以 60 之后)。 -
返回格式化的时间:
-
最后,使用 f-string 将小时数、分钟数和秒数组合在一起,使用
zfill(2)
来确保每部分都至少包含两个数字。
通过使用此方法,可以避免浮点精度问题并获得所有测试用例的正确时间格式。
标签:python,logic From: 78774206