我有这段代码,我需要修改以通过下面的断言测试:
def degrees_to_dms(degrees_fraction):
''' Convert degrees to degree, minute, second 3-tuples'''
degrees = int(degrees_fraction)
minutes = abs(degrees_fraction - degrees) * 60.0
seconds = np.round((degrees_fraction - degrees - minutes/60.0) * 3600.0, 2)
return (degrees, abs(minutes), abs(seconds))
def dms_to_degrees(d,m,s):
''' Convert degrees, minutes, seconds to fractional degrees'''
return float(d)+float(m/60.00)+float(s/3600.00)
它需要通过assert测试:
assert dms_to_degrees(*degrees_to_dms(42.2833333333)) == 42.28333333333333
唯一的区别是预期结果中多了4个3。在迭代过程的每个步骤时,看起来float(d)与float(m/60.00)在dms_to_degrees中的相加会导致小数点后五位的四舍五入。我想让它输出额外的3。我还注意到m/60 = 0.2833333332999999,所以我不知道为什么他们希望2999999变成3。但也许我们需要一种完全不同的方法。
谢谢。
这不是输出中显示的小数数问题,而是正常的浮点数问题。
您可以通过以下格式在输出中显示更多小数:
print(f'{dms_to_degrees(*degrees_to_dms(42.2833333333)):.50f}')
# 42.28333333329999987881819834001362323760986328125000
浮点数的比较是没有意义的,并且不可移植。你应该使用isclose来比较浮点数:
assert np.isclose(dms_to_degrees(*degrees_to_dms(42.2833333333)) , 42.28333333333333)
更新如果你不能改变测试,你可以通过将分钟四舍五入到一个整数来修复degrees_to_dms
,如果该值非常接近整数(小于某个epsilon,例如1e-6):
def degrees_to_dms(degrees_fraction):
''' Convert degrees to degree, minute, second 3-tuples'''
degrees = int(degrees_fraction)
minutes = abs(degrees_fraction - degrees) * 60.0
if (abs(minutes - round(minutes)) < 1e-6):
minutes = round(minutes)
seconds = np.round((degrees_fraction - degrees - minutes/60.0) * 3600.0, 2)
return (degrees, abs(minutes), abs(seconds))
在我看来,然而,这只是一个诡计,使一个设计不良的测试用例通过。例如,查看https://www.fcc.gov/media/radio/dms-decimal:上42.2833333333
的输出,它们显示的是42° 16' 59.9982"
而不是42° 17' 0.0"
。