Python圆您可能会学会如何在中学围绕数量,甚至可能在年级学校。如果你想四舍五入4.85到十进制的地方,你应该有4.9,对吗?如果您正在处理计算机。如果您将Python汇到4.85至1位小数位,因此您将获得4.8。这真的是一个计算机问题,而不是一个Python问题,但如果您使用Python,我们将向您展示如何应对此Quirk和其他人。为初学者提供这门课程的Python背景知识

一些背景:浮点数不要沉没

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

>>>圆形(4.85,1)

4.85

根据圆形()函数的定义,此结果是错误的。中途的价值观应该远离零,因此应响应应该是4.9。我们可以使用十进制模块来查看存储浮点数的实际值。自Python 2.4以来,十进制模块已可用。

>>>从十进制进口十进制

>>>十进制(4.85)

小数(“4.8499999999999996447286321199499070644378662109375”)

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

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

在10次添加0.2至自身时,还可以看到此问题:

>>> SUM = 0

>>>对于I系列(10):

sum + = 0.2#命中返回/输入两次以返回提示

>>>总和

1.9999999999999998.

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

>>>圆形(总和,2)

2.0

解决方案:十进制模块

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

>>>成本= 6.22

>>>成本#we回显变量以检查其值

6.22

>>> qcost = cost / 4

>>> Qcost.

1.555.

> > >轮(qcost, 2)

1.55

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

>>>从十进制导入* #we导入所有模块,不像以前一样小数

>>> dcost =十进制(cost)

> > > dcost

十进制('6.2199999999999975493424839649346506506499999975549999999754999999975549999997596499999975499999975506499999775464999975506347656255065063476506506493465650650649365065064934765065064634765065063476506506506347650650634765625']

嘿!怎么了它没有制作2个小数点?答案是十进制数由字符串变量构成。我们必须耗尽成本,然后转换为十进制:

>>>成本= 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_ceiling:始终向上朝向无穷大。

ROUND_DOWN:总是向零方向舍入。

round_floor:始终朝向负无穷大。

round_half_down:如果最后一个有效数字大于或等于5,则返回零,否则返回零。

round_half_up:像round_half_down,除了最后一个有效的数字为5,值远离零。

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

这里的道德是不依赖于控制台的回声来向您展示最终计划中会发生什么。使用print()。

其他解决方案

如果你广泛地编程与财务计算,t他蟒蛇钱包和压岁钱包是可用的。他们为使用十进制模块提供货币和金钱的课程。Py-Moneyed包是最近的。一旦包装已添加到您的系统中,可以在不必担心浮点问题的情况下分配和使用Money Variables:

>>>从金钱.Classes进口货币

>>> my_price = money(金额= '21 .4',currency ='usd')

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

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

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

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

>>>进口数学

>>> Math.Ceil(1.234)

2

>>> Math.ceil(-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.7 (3,235)
Python 3:Dive Dive(第3部分 - 哈希地图)
弗雷德巴普蒂斯特
4.7 (709)
Python 3: Deep Dive (Part 4 - OOP)
弗雷德巴普蒂斯特
4.8 (1172)
完整的Pandas Bootcamp 2021:数据科学与Python
亚历山大Hagmann
4.7 (2,012)
算法交易A-Z与Python,机器学习和AWS
亚历山大Hagmann
4.6 (500)
畅销书
数据分析与熊猫和Python
鲍里斯Paskhaver
4.7 (13,279)
畅销书
人工智能:Python中的强化学习
懒程序员团队,懒程序员公司。
4.6 (8595)
畅销书
高级人工智能:Python深度强化学习
懒程序员团队,懒程序员公司。
4.6 (3,869)
数据科学:Python中的自然语言处理
懒惰的程序员。
4.6 (9,611)
评价最高

更多Python课程

Python的学生也会学到

赋予你的团队。引领行业。

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

请求一个演示