在python中如何获得十进制数?

在python中如何获得十进制数?,python,Python,在一次真正超现实的经历中,我花了20分钟完成了一项我认为需要20秒的任务 我想用带3个或更多位置的小数。我不能得到超过1个位置的任何东西,即使在这种情况下,这也是胡说八道 例如,我无法将1/3显示为0或0.0以外的任何内容 谷歌搜索让我找到了Decimal,但Decimal也帮不上忙 请结束这场折磨,告诉我怎样才能让1/3显示为.333 编辑谢谢大家的澄清!显然,计算机科学家发明了一种叫做整数除法的东西来迷惑和激怒数学家。感谢您的好意,消除了我的困惑。在Python 2中,1/3进行整数除法,因

在一次真正超现实的经历中,我花了20分钟完成了一项我认为需要20秒的任务

我想用带3个或更多位置的小数。我不能得到超过1个位置的任何东西,即使在这种情况下,这也是胡说八道

例如,我无法将
1/3
显示为
0
0.0
以外的任何内容

谷歌搜索让我找到了Decimal,但Decimal也帮不上忙

请结束这场折磨,告诉我怎样才能让
1/3
显示为
.333


编辑谢谢大家的澄清!显然,计算机科学家发明了一种叫做整数除法的东西来迷惑和激怒数学家。感谢您的好意,消除了我的困惑。

在Python 2中,
1/3
进行整数除法,因为两个操作数都是整数。您需要执行浮点除法:

1.0/3.0
或:


这将使
/
进行实数除法,
/
进行整数除法。这是Python 3的默认值。

您的值必须是浮点

In [1]: 1/3
Out[1]: 0

In [2]: 1/3.0
Out[2]: 0.33333333333333331


如果你除以2个整数,你将得到一个被截断的整数结果(即,结果的任何小数部分都被丢弃),这就是为什么

 1 / 3
给你:

 0
要避免此问题,至少需要一个操作数为浮点。e、 例如,
1.0/3
1/3.0
或(当然)
1.0/3.0
将避免整数。顺便说一句,这种行为不是Python独有的

Edit:如@Ivc在下面的一条有用注释中所述,如果其中一个整数操作数为负数,则结果将改为“ed”-请参见原因)

此外,数字的内部和外部表示可能存在一些混淆。数字就是它,但我们可以确定它的显示方式

可以使用格式化说明控制外部表示形式。例如,一个数字可以在小数点后显示5位数字,如下所示:

n = 1/3.0

print '%.5f' %n
0.33333
以获取小数点后的15位数字

print '%.15f' %n
0.333333333333333
最后,还有一种使用
.format()
函数格式化字符串/数字的“新的和改进的”方法,这种方法可能比我上面介绍的
%
-格式化要长得多。例如:

print 'the number is {:.2}'.format(1.0/3.0)
将给你:

the number is 0.33

在Python2中,必须至少指定一个操作数作为浮点数。要仅取3位小数,可以使用
round()
方法:

>>> a = 1.0 / 3
>>> round(a, 3)
0.333
在Python3中,默认情况下它们似乎不执行整数除法,因此您可以执行以下操作:

>>> a = 1/3
>>> round(a, 3)
0.333

使用十进制。你可以在圆点后面得到100位数字

from decimal import *
getcontext().prec = 100
Decimal(1)/Decimal(3)

您的意思是像
“%.3f%”(1.0/3)
这样的东西是您所需要的吗?Python与许多其他语言不同,它的独特之处在于您不需要显式声明变量包含的信息类型。(它是“duck-typed”)在这种情况下,当你除以两个整数时,你得到的结果也是一个整数,也就是四舍五入的答案。Python2.x中的这种行为非常烦人,以至于他们在Python3中对其进行了更改。解决方案是始终注意如何声明变量。或者在一个数字中包含一个小数点以声明您想要一个非整数答案(1./3就足够了),或者通过float(1)/float(3)显式更改类型@About:虽然公平地说,知道两个整数之间的运算结果是相同的类型而不是不同的类型也很好。@jdi:这让程序员感到安慰,我可以看到一些边缘情况下,这种行为是有用的。但对于脚本和计算应用程序来说,必须训练用户键入“1./3”是一个巨大的难题。争论的存在证明了python的广泛采用我想你错过了op正在分裂的事实ints@jdi我一直在尝试浮动(1/3),但徒劳地试图阻止1/3的四舍五入0@rschwieb啊。。是的,正确的想法,但不幸的是,操作顺序不太正确:-)@SethCarnegie True:-)。。一旦你经历了由此带来的问题,你就会倾向于记住。关于C,我甚至不想去想我曾经作为一个新手在
if(I=0)
上花了多少小时,而我真正的意思是
if(I=0)
。。argh.整数除法不会截断,而是向下取整:
-1//3
为-1。这与C的行为不同,C的行为是截断(
-1/3
是0)。
/
始终是地板分割,即使没有将来的导入(重要的是,不管操作数的类型是什么-
1.0///3==0
,尽管Py2仍然以浮点形式返回)。@lvc是的,我知道,我刚才提到它是为了让他知道,即使使用
from\uuuuuu future\uuuuuu导入除法
>>> a = 1/3
>>> round(a, 3)
0.333
from decimal import *
getcontext().prec = 100
Decimal(1)/Decimal(3)