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

Python 使用zip函数并使用getcontext()获取错误。prec=2,python,Python,我在尝试使用getcontext().prec=2函数时遇到了一个问题,即试图获得只有2个小数的十进制结果。我已经尝试过几种变体,但不知道为什么我不能在我的一个列表中将float转换为string。我刚开始使用Python(2.6),还没有找到解决方案。提前感谢您的帮助 from __future__ import division from decimal import * getcontext().prec = 2 list_a = ['abc','def','ghi'] list_b

我在尝试使用getcontext().prec=2函数时遇到了一个问题,即试图获得只有2个小数的十进制结果。我已经尝试过几种变体,但不知道为什么我不能在我的一个列表中将float转换为string。我刚开始使用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'. 
有什么见解吗? 干杯

应该是

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)
应该是

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)

假设您发布的代码代表您实际使用的代码,则以下行:

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
如果删除多余的括号,则代码将在不带括号的情况下运行
错误。

假设您发布的代码代表了您实际使用的代码,那么下面一行:

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
如果删除多余的括号,则代码将在不带括号的情况下运行
错误。

看起来您有一个额外的字符(在t_c=line.Decimal(str((2/9))

看起来您有一个额外的字符(在t_c=line.Decimal(str((2/9))

语法错误
是非常固定的,但不会影响要显示的位数问题

在Python2.6及更早版本上,您需要先将
float
s转换为
str
ings,然后再将其转换为
decimal
s。有关更多信息,请参阅。在较新版本的Python上,您可以直接将
float
转换为
decimal

引自:

新的
十进制
的重要性仅由输入的位数决定。上下文精度和舍入仅在算术运算期间起作用

要将a
Decimal
四舍五入到一定的位数,请使用普通Python函数:

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)]
或:

如果只想显示两位数字,但想存储全部精度,请使用
str.format
中的:

                # 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)

SyntaxError
是很容易修复的,但不会影响要显示的位数问题

在Python2.6及更早版本上,您需要先将
float
s转换为
str
ings,然后再将其转换为
decimal
s。有关更多信息,请参阅。在较新版本的Python上,您可以直接将
float
转换为
decimal

引自:

新的
十进制
的重要性仅由输入的位数决定。上下文精度和舍入仅在算术运算期间起作用

要将a
Decimal
四舍五入到一定的位数,请使用普通Python函数:

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)]
或:

如果只想显示两位数字,但想存储全部精度,请使用
str.format
中的:

                # 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)

我在
print
行中没有看到
str()
。你的代码和周围的文本是最新的吗?你能改为粘贴不同版本的代码和结果吗?谢谢。这三个版本仅限于更改列表c:一个像现在一样,一个没有str,另一个没有十进制(str,它用所有小数打印正确的东西(我只想要2)。它不计算到小数点后两位的原因是因为它对字符串的结果进行了精确转换,例如str(1/7)='0.142857142857'所以十进制(str(1/7))十进制('0.142857142857'))。如果您想让它使用您设置的prevision,则必须将一个小数点除以另一个小数点,如decimal(1)/decimal(7)。打印与计算小数点不同,因为您可以指定小数点的数量,但您所做的是尝试计算到两个小数点。我看不到
str()
打印
行中。您的代码与周围的文本是否是最新的?您可以改为粘贴不同版本的代码和结果吗?谢谢。这三个版本仅限于更改列表c:一个与现在一样,一个没有str,另一个没有十进制(str,它用所有小数打印正确的东西(我只想要2)。它不计算到小数点后两位的原因是因为它对字符串的结果进行了精确转换,例如str(1/7)='0.142857142857'所以十进制(str(1/7))十进制('0.142857142857'))。如果要使用您设置的前缀,必须将一个十进制数除以另一个十进制数,如十进制数(1)/十进制数(7)。打印与计算小数位数不同,因为您可以指定小数位数,但您所做的是尝试计算小数位数。这并不能解决他的真正问题,使小数位数具有两位数的精度。我不知道。我认为他的真正问题是语法错误。可能是我们的观点s不一样。谢谢,我注意到了括号。但是,修复后,显示不限于两个小数。你知道tio如何在结果中只显示两个小数吗?这并不能解决他的真正问题,让小数具有两位数的精度。我不知道。我想他真正的问题是语法错误。可能的但是,我们的视角不同。谢谢,我注意到了括号。但是,修复后,显示不限于2分米