【问题标题】:How to extend number of decimals that show如何扩展显示的小数位数
【发布时间】:2021-10-13 02:35:57
【问题描述】:

我需要更改此代码以通过以下断言测试:

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 dms_to_degrees(*degrees_to_dms(42.2833333333)) == 42.28333333333333

唯一的区别是预期结果中多了四个 3。在迭代过程的每个步骤时,看起来在 dms_to_degrees 中添加 float(d) 和 float(m/60.00) 会导致小数位四舍五入。我想让它输出那些额外的 3。我还注意到 m/60 = 0.2833333332999999,所以我不知道他们为什么期望 2999999 无论如何都会变成全 3。但也许完全需要一种不同的方法。

谢谢。

【问题讨论】:

    标签: python function numpy latitude-longitude


    【解决方案1】:

    这不是输出中显示的小数位数问题,而是正常的浮点问题。

    您可以通过格式化在输出中显示更多小数:

    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,如果值非常接近整数(比 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"

    【讨论】:

    • 我认为他们没有办法改变断言。我认为这里有一种方法可以通过断言进行浮点数学运算
    • @MegaIng:你可能是对的,但我认为浮点数学没有合理的变化来传递断言,因为42.28333333333333(右手边)不可能表示为一个有限的浮点数,所以我认为整个工作毫无意义
    • 好的,我收回。断言只是被破坏了42.2833333333 != 42.28333333333333
    • 谢谢大家。那么我应该如何处理它呢? Megalng 是对的,因为我无法更改断言。
    • @Julien:请看我更新的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 2021-07-19
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多