我在尝试使用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'.
任何见解? 干杯
答案 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)]
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))