如何扩展显示的小数数



我有这段代码,我需要修改以通过下面的断言测试:

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"

相关内容

  • 没有找到相关文章

最新更新