2016-03-04 101 views
1

为PythonPython的float精度约小数

a = 1 

for x in range(5): 
    a += 0.1 
    print(a) 

这是结果:

1.1 1.2000000000000002 1.3000000000000003 1.4000000000000004 1.5000000000000004

我怎样才能用这个处理? round()函数的唯一方法是什么?我可以在设置值之前设置变量的精度吗?

回答

3

我可以设置一个变量的精度设定值之前?

使用decimal模块,不像float(),提供任意精度和能准确地表示十进制数:

>>> from decimal import Decimal, getcontext 
>>> 
>>> getcontext().prec = 5 
>>> 
>>> a = Decimal(1) 
>>> 
>>> for x in range(5): 
...  a += Decimal(0.1) 
...  print(a) 
... 
1.1000 
1.2000 
1.3000 
1.4000 
1.5000 
2

你可以像这样格式化你的输出;

a=1 
for x in range(5): 
    a += 0.1 
    print("{:.9f}".format(a)) 
1

假设你的问题是只显示号码,@Jaco的回答做工作。但是,如果您担心使用该变量并可能进行比较或分配给字典键,我会说你必须坚持round()。例如,这是行不通的:

a = 1 
for x in range(5): 
    a += 0.1 
    print('%.1f' % a) 
    if a == 1.3: 
     break 

1.1 
1.2 
1.3 
1.4 
1.5 

你不得不做的事:

a = 1 
for x in range(5): 
    a += 0.1 
    print('%.1f' % a) 
    if round(a, 1) == 1.3: 
     break 

1.1 
1.2 
1.3 
1

格式化输出已经@Jaco被正式提出。但是,如果您想要控制超出纯输出的变量的精度,则可能需要查看decimal模块。

from decimal import Decimal 

a = 1 
for x in range(3): 
    a += Decimal('0.10') # use string, not float as argument 
    # a += Decimal('0.1000') 
    print(a) # a is now a Decimal, not a float 

> 1.10 # 1.1000 
> 1.20 # 1.2000 
> 1.30 # 1.3000 
+0

不错的建议使用字符串作为'Decimal()'的输入。不知何故,我错过了有用的功能。 – Chris

+0

@Chris读你的答案,我不得不承认,我不知道你可以使用get_context设置一般精度:D我只使用上下文来设置一般的舍入行为。 – schwobaseggl