Python3小数点精度

时间:2018-07-09 12:24:06

标签: python python-3.x floating-point precision

我正在用Python 3编写图形计算器

但是,这里的代码给我带来了麻烦。

def domainGen(start,end,step):
    #generates a list of points for t, x, or theta to be equal to.
    #Acts like a floating point equivalent to "range" except it generates a whole list object, not just an iterator
    domain = [] #creates an empty list to store the domain
    minInt = start//step #rounding towards zero
    maxInt = end//step #rounding towards zero
    for n in range(minInt-1,maxInt + 1):
        if n*step >= start and n*step <= end:domain.append(n*step)
    return domain

此函数的变量都是用户输入,需要为浮点数或Decimal()值,以实现任意精度。

但是,运行此代码时,出现了很多浮点计算错误,似乎是随机出现在“域”列表中的数字上。

这是domainGen(0,10,0.1)的输出:

[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9, 1.0, 1.1, 1.2000000000000002, 1.3, 1.4000000000000001, 1.5, 1.6, 1.7000000000000002, 1.8, 1.9000000000000001, 2.0, 2.1, 2.2, 2.3000000000000003, 2.4000000000000004, 2.5, 2.6, 2.7, 2.8000000000000003, 2.9000000000000004, 3.0, 3.1, 3.2, 3.3000000000000003, 3.4000000000000004, 3.5, 3.6, 3.7, 3.8000000000000003, 3.9000000000000004, 4.0, 4.1000000000000005, 4.2, 4.3, 4.4, 4.5, 4.6000000000000005, 4.7, 4.800000000000001, 4.9, 5.0, 5.1000000000000005, 5.2, 5.300000000000001, 5.4, 5.5, 5.6000000000000005, 5.7, 5.800000000000001, 5.9, 6.0, 6.1000000000000005, 6.2, 6.300000000000001, 6.4, 6.5, 6.6000000000000005, 6.7, 6.800000000000001, 6.9, 7.0, 7.1000000000000005, 7.2, 7.300000000000001, 7.4, 7.5, 7.6000000000000005, 7.7, 7.800000000000001, 7.9, 8.0, 8.1, 8.200000000000001, 8.3, 8.4, 8.5, 8.6, 8.700000000000001, 8.8, 8.9, 9.0, 9.1, 9.200000000000001, 9.3, 9.4, 9.5, 9.600000000000001, 9.700000000000001, 9.8, 9.9]

我想要一个函数,它可以告诉我用户指定其值的小数位数,这样我就可以将这些数字四舍五入到相同的精度。

有内置的功能可以帮助我吗?

如果没有,那么解决该问题的最Python方式是什么?

注释:

  

我知道那里有很好的图形模块,我想自己做练习。

     

我听说过“十进制”模块,但不确定如何使用它,以及在这种情况下是否有帮助。

     

首选小数点精度,但采用有意义的图形精度的适当解决方法可能会有用。

     

我知道this这个问题,但是我理解为什么会出现浮点错误,正如我所说,我需要一个函数来告诉我用户给了我多少精度的小数点,因此它不能重复

1 个答案:

答案 0 :(得分:1)

如果有人输入浮点或整型文字,则可以执行以下操作:

def get_float(s):
    if '.' in s:
        return float(s), len(s) - s.index('.') - 1
    else:
        return float(s), 0

此函数返回一个元组,该元组由相应的浮点数和小数点后的字符数组成。如果要正确处理包含eE的浮点文字,则需要对其进行修改。

例如:

>>> get_float('2')
(2.0, 0)
>>> get_float('2.1')
(2.1, 1)
>>> get_float('.001')
(0.001, 3)
>>> get_float('-0.001')
(-0.001, 3)

作为一个实际问题,是否真的可以安全地假设用户因为输入'2.01'而不是'2.01000'而实际上只关心两位小数的精度?如果您要具有用户指定的精度,为什么不让用户明确提供该精度?