python轮你可能在中学,甚至在小学就学会了如何取整数。如果要四舍五入4。85到小数点后1位,应该是4。9,对吧?如果你是和电脑打交道的话就不会。如果你用Python将4.85四舍五入到小数点后一位,结果是4.8。这实际上是一个计算机问题,而不是Python问题,但是如果你使用Python,我们将向你展示如何处理这个怪癖和其他问题。为初学者提供这门课程的Python背景知识

一些背景知识:不要被浮点数淹没

如上所述,这个问题实际上是一个计算机问题。计算机在我们使用的以10为基数的数字系统中是不能工作的。相反,计算机以2为基数。计算机可以准确地存储整数,但是有小数点后位的数字不能在计算机上以2为基数精确地表示。在计算机术语中,有小数点的数称为浮点数。通过这门课程,你可以复习浮点数和其他数据类型。让我们看一下Python shell中的一个例子:

> > >轮(4.85,1)

4.85

根据round()函数的定义,这个结果是错误的。中间值应该舍去零,所以响应应该是4。9。我们可以使用decimal模块来查看为浮点数存储的实值。十进制模块从Python 2.4开始就可用了。

>>> from decimal import十进制

> > >小数(4.85)

小数(“4.8499999999999996447286321199499070644378662109375”)

注意这里的区分大小写。带有小写d的“decimal”是整个模块的名称。它包含一个名为Decimal的构造函数,带有大写的d。Decimal“构造”一个等效的真正十进制数,而不是浮点数。它向我们展示了浮点数的值,它实际上存储在计算机内存中。

浮点数4.85被存储为一个略小于4.85的数,如图所示。当这个数字四舍五入到小数点后1位时,它会四舍五入到4.8并显示出来。由于处理浮点数的方式,这个问题在大多数计算机处理器中都很常见。

当将0.2这个数字自身加10次时,也会发现这个问题:

>>> sum = 0

>>> for I in range (10):

Sum += 0.2 #按两次返回/输入返回提示符

> > >和

1.9999999999999998

但是,在这种情况下,如果您使用round(),结果将是您所期望的

> > >轮(和,2)

2.0

解决方案:十进制模块

十进制模块是为了实现我们在学校学到的十进制算术而开发的。它存储真正的以10为基数的十进制数。成本是处理时间多一点。让我们看一个使用美元金额的例子。这些四舍五入到小数点后两位,在5的情况下,结果四舍五入,所以1。555变成了1。56 -1。555变成了-1。56。假设计算结果是6.22,必须除以4:

>>> cost = 6.22

我们回显变量来检查它的值

6.22

>>> qcost = cost / 4

> > > qcost

1.555

> > >轮(qcost, 2)

1.55

哦,这就是我们的浮点问题!我们引入小数部分。

我们导入了所有的模块,而不仅仅是之前的decimal

>>> dcost =十进制(cost)

> > > dcost

小数(“6.21999999999999975131004248396493494510650634765625”)

嘿!为什么小数点没有两位呢?答案是Decimal数字是由字符串变量构造的。我们必须用cost创建一个字符串,然后转换为Decimal:

>>> cost = 6.22

>>> dcost =十进制(str(cost))

> > > dcost

小数(“6.22”)

>>> qdcost = dcost/4

> > > qdcost

小数(“1.555”)

> > >轮(qdcost, 2)

小数(“1.56”)

是的!让我们来看另一个例子:

>>> cost2 = 5.78

>>> dcost2 =十进制(str(cost2))

> > > dcost2

小数(“5.78”)

>>> qdcost2 = dcost2 /4

> > > qdcost2

小数(“1.445”)

> > >轮(qdcost2, 2)

小数(“1.44”)

开枪!现在怎么办呢?要了解这里发生了什么,我们必须进一步研究小数模块。decimal模块有一组称为context的参数。幸运的是,我们导入了所有模块,所以我们可以通过getcontext()方法查看参数:

> > > getcontext ()

Context(prec=28,舍入=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[InvalidOperation, Inexact, FloatOperation, Rounded], traps=[InvalidOperation, DivisionByZero, Overflow])

我们需要的参数用大写字母表示:舍入选项。ROUND_HALF_EVEN的定义如下:

如果要四舍五入的值是5,则检查前面的数字。偶数导致结果向下舍入,奇数导致结果向上舍入。

这就是问题所在:在第二个例子中,前面的数字是4,这是偶数,所以结果四舍五入。这一选项在科学中使用,在科学中,总是将中间值舍入可能会引入轻微的偏差。平均而言,向上舍入的值比向下舍入的值要多,所以很多舍入的计算可能会导致略高的值。以下是小数模块舍入的其他选择:

圆天花板:永远向上圆,直到无限。

ROUND_DOWN:总是向零方向舍入。

ROUND_FLOOR:总是向负无穷方向四舍五入。

ROUND_HALF_DOWN:如果最后一个有效数字大于或等于5,则向零处舍入,否则向零处舍入。

ROUND_HALF_UP:类似于ROUND_HALF_DOWN,但如果最后一个有效数字是5,则该值将从0四舍五入。

ROUND_UP:向零方向舍入。

ROUND_05UP:如果最后一个数字是0或5,则舍入零位,否则舍入零位。

为了钱,我们想要ROUND_HALF_UP选项。我们可以通过getcontext()方法来设置:

> > > getcontext () .rounding = ROUND_HALF_UP

>>> cost2 = 5.78

>>> dcost2 =十进制(str(cost2))

> > > dcost2

小数(“5.78”)

>>> qdcost2 = dcost2 /4

> > > qdcost2

小数(“1.445”)

> > >轮(qdcost2, 2)

小数(“1.45”)

是的!那么这个“Decimal(' 1.45 ')”呢?我们希望用户看到的最终成本是1.45。如果我们打印()答案,这个问题就解决了:

>>> rqdcost = round(qdcost2,2)

> > >打印(rqdcost)

1.45

这里的寓意是,不要依赖控制台中的echo来显示最终程序中会发生什么。使用print()。

其他的解决方案

如果你广泛地编程与财务计算,t他蟒蛇钱包和压岁钱包是可用的。它们为使用decimal模块的currency和money提供类。红包是最近才出现的。一旦包被添加到你的系统中,Money变量可以被分配和使用,而不用担心浮点数问题:

> > >从有钱的。类进口的钱

货币(金额= ' 21.4 ',货币= '美元')

如果您没有使用货币数据,但需要指定数字如何四舍五入,可以尝试math模块中的一些方法。这是Python中包含的,可以导入。这门课有一节是关于数学函数的。相关方法有:

math.ceil(x):返回x的上限,即大于或等于x的最小整数。

math.floor(x):返回小于或等于x的最大整数x的层数。

math.trunc(x):返回截断为整数的实值x。

> > >导入数学

> > >数学。装天花板(1.234)

2

> > >数学。装天花板(-1.234)

1

> > > math.floor (1.234)

1

> > > math.floor (-1.234)

2

> > > math.trunc (1.234) 1

> > > math.trunc (-1.234)

1

这应该会让你很好地了解Python舍入的危险,当你准备好了,通过这门课程,您可以将您的Python技能提升到下一个层次。

Python顶级课程

数据科学:Python中的自然语言处理
懒惰的程序员。
4.6 (9613)
评价最高
Python 3:深度潜水(第2部分-迭代,生成器)
弗雷德巴普蒂斯特
4.9 (1294)
评价最高
用Python和Django - Advanced构建一个后端REST API
马克·温特伯顿,布鲁克·卢瑟福
4.6 (3967)
畅销书
用Python自动化软件测试
Jose Salvatierra的Teclado
4.6 (3255)
面向绝对初学者的Python
绿色变色龙学习
4.4 (18677)
Python 3: Deep Dive (Part 4 - OOP)
弗雷德巴普蒂斯特
4.8 (1177)
为初学者提供的Python完整大师类
Mihai Catalin Teodosiu, EpicPython学院
4.5 (2463)
畅销书
算法交易A-Z与Python,机器学习和AWS
亚历山大Hagmann
4.6 (508)
畅销书
Python中的设计模式
Dmitri Nesteruk
4.5 (1329)

更Python的课程

Python的学生也会学到

让你的团队。领导行业。

使用Udemy for Business订阅在线课程库和数字学习工具。

请求一个演示