使用zip函数并使用getcontext()获取错误.prec = 2

时间:2012-04-01 01:06:29

标签: python

我在尝试使用getcontext()。prec = 2函数时遇到问题,试图获得只有2位小数的十进制结果。我已经尝试了几种变体,但不知道为什么我不能将float转换为我的一个列表中的字符串。我是使用Python(2.6)的新手,并且无法找到解决方案。提前感谢您的帮助。

from __future__ import division
from decimal import *

getcontext().prec = 2

list_a = ['abc','def','ghi']
list_b = [123, 534, 345]
list_c = [Decimal(str(1/6)), Decimal(str(1/1234)), Decimal(str(2/9))]

for r,c,p in zip(list_a, list_b, list_c):
  print '{0} goes with {1} and with {2}%.'.format(r,c,p)

返回

SyntaxError: Invalid syntax

如果我从打印行中删除str(),则会打印结果,但不会对小数位数进行约束。如果我使用Decimal() - w / o先使用str,我会得到

'first convert the float to a string'. 

任何见解? 干杯

4 个答案:

答案 0 :(得分:2)

Decimal(str((2/9))

应该是

Decimal(str(2/9))

示例中显示的代码中有一个未关闭的)

仅显示两位小数:

from __future__ import division
from decimal import *

getcontext().prec = 2

list_a = ['abc','def','ghi']
list_b = [123, 534, 345]
list_c = [Decimal(str(1/6)), Decimal(str(1/1234)), Decimal(str(2/9))]
for r,c,p in zip(list_a, list_b, list_c):
  print '{0} goes with {1} and with {2:.2f}%.'.format(r,c,p)

答案 1 :(得分:2)

假设您发布的代码代表了您真正使用的代码,请执行以下操作:

list_c = [Decimal(str(1/6)), Decimal(str(1/1234)), Decimal(str((2/9))]

有语法错误。计算括号(或使用与您匹配的编辑器)。我已更改格式以突出显示错误:

list_c = [
    Decimal(str (   1 /6   )),
    Decimal(str (   1 /1234)),
    Decimal(str ( ( 2 /9   )),
    ]           # ^
                # here

如果删除无关的括号,代码将在没有的情况下运行 错误。

答案 2 :(得分:2)

SyntaxError很简单,但不会影响您要显示的位数问题。

在Python 2.6及更早版本中,您需要先将float转换为str,然后再将其转换为decimal。有关详细信息,请参阅conversion from float to Decimal in python-2.6: how to do it and why they didn't do it。在较新版本的Python上,您可以直接从float转换为decimal

引用decimal docs

  

Decimal的重要性仅取决于输入的位数。上下文精度和舍入仅在算术运算期间发挥作用。

围绕 Decimal到一定数量的数字,请使用普通的Python round函数:

getcontext().prec = 2

                   # don't need str on Python 2.7+
list_c = [round(Decimal(str(x)), getcontext().prec) for x in (1/6, 1/1234, 2/9)]

Decimal.quantize

getcontext().prec = 2
precision = Decimal(10) ** -getcontext().prec
list_c = [Decimal(x).quantize(precision) for x in (1/6, 1/1234, 2/9)]

如果您只想显示两位数,但希望存储完整精度,请使用str.format中的precision format specifier

                # don't need str on Python 2.7+
list_c = [Decimal(str(x)) for x in (1/6, 1/1234, 2/9)] 

for r,c,p in zip(list_a, list_b, list_c):
  print '{0} goes with {1} and with {2:.2}%.'.format(r,c,p)

答案 3 :(得分:1)

看起来你有一个额外的(在t_c =行。十进制(str((2/9))