资讯专栏INFORMATION COLUMN

Python数值处理(一)

isaced / 3279人阅读

摘要:取整使用函数可以轻松的对浮点数进行取整操作。这是因为函数在应对这种与两个整数距离相同的情况时,会取到最近的偶数上去。如果你特别需要精确的数值,那么可以使用模块。

round()取整

使用round()函数可以轻松的对浮点数进行取整操作。示例如下:

>>> round(1.23, 1)
1.2
>>> round(1.27, 1)
1.3
>>> round(-0.36, 1)
-0.4

round()第二个参数可以是负数:

>>> a = 13849
>>> round(a, -1)
12850
>>> round(a, -2)
13800

但是要注意,这里有两个很奇怪的例子:

>>> round(2.5)
2
>>> round(0.5)
0

可以发现,这里完全没有按照我们所熟悉的四舍五入的取整规则来。这是因为round()函数在应对这种与两个整数距离相同的情况时,会取到最近的偶数上去。

同时官方文档中还举了一个例子,

Note The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.

round(2.675, 2)的结果居然是2.67,这个的原因是浮点数表示是有误差的,2.675在计算机上实际上不是准确的2.675。

解释一下浮点数问题

首先我们要明确一个概念,计算机只能识别二进制,也就是一堆10的组合,但是人类常用的却是十进制。
十进制的数在计算机里就需要转换成二进制表示,在将十进制整数转为二进制的时候,往往是将原数不断除以2,直到商小于1,将每一次得到的余数逆序排列,就能得到这个整数的二进制表示了。
到了小数部分,我们采用的是乘以2,取整数部分,直到小数部分为0,顺序排列。但是有些特殊的数就要搞事情了。

0.1 * 2 = 0.2 => 0
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
0.6 * 2 = 1.2 => 1
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
...

发现没有,进入无限循环了,也就是说整数中一些小数,在二进制表示的时候是无限循环小数,但是在计算机中毕竟是用有限位来表示一个值的,这就造成了有些小数(浮点数)在计算机中是被截掉部分的,这就是浮点数不精确的原因啦。

decimal

如果你特别需要精确的数值,那么可以使用decimal模块。当然这是有性能代价的(有得必有失嘛)。
举个例子:

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a+b) == 6.3
False
# 这次试试decimal
>>> from decimal import Decimal
>>> a = Decimal("4.2")
>>> b = Decimal("2.1")
>>> a + b
Decimal("6.3")
>>> print(a+b)
6.3
>>> (a + b) == Decimal("6.3")
True
数值的输出格式化

如果只是想让数值以固定的位数输出,那么是用不着round()的。

>>> a = 1.23456
>>> format(a, "0.2f")
"1.23"
>>> format(a, "0.3f")
"1.234"

欢迎关注个人公众号公子政的宅日常查看更多文章:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43961.html

相关文章

  • Python强大的语法支持

    摘要:浮点数计算不光对整数运算提供了支持,同样对我们俗称的小数也提供了便利的运算。但要注意的一点是有些版本对于浮点数是位数限制的对比下面两张图,所以可能会出现溢出或者未知报错,在真正开发的过程中,尽量不要写这种代码否则背锅。 学习任何一种编程语言,包括但不限于C、C++、Java、Python,我...

    adie 评论0 收藏0
  • Python创建数值列表

    摘要:创建数值列表上一篇文章列表处理下一篇文章字典处理可以产生一些列数值语法开始下标包括结束下标不包括步长实例结果利用将产生的数值转化为列表实例结果列表解析快速生成数值列表语法实例实例结果 Python创建数值列表 上一篇文章:Python列表处理下一篇文章:Python字典处理 1、range range()可以产生一些列数值语法:range(开始下标(包括),结束下标(不包括)[,步长...

    MockingBird 评论0 收藏0
  • 真假美猴王-Numpy数据与Python数组的区别与联系

    摘要:下文统一称为数组是存储单一数据类型的多维数组同语言数组直接保存数值而则是能够对数组进行处理的函数。动态数据类型与的数组和的这些不可变数据类型的适用场景等可变数据类型适用于需要不断对原始数据进行修改的场景。 showImg(https://segmentfault.com/img/remote/1460000018925396);Numpy,是python中的一个矩阵计算包,功能类似ma...

    邹强 评论0 收藏0
  • Python 与 Unicode

    摘要:最近使用处理一些网络相关的问题,被相关的一系列编码问题搞得一头雾水。与接下来是中对于字符串的处理。中的和在中,其类型规定了底层的数据结构,是位整数串,也即跟语言中的字符串类似。这些问题在中得到解决。 最近使用 Python 2 处理一些网络相关的问题,被 Unicode, String 相关的一系列编码问题搞得一头雾水。在这里整理一下相关的概念吧。 ASCII Unicode UTF8...

    Tangpj 评论0 收藏0
  • SICP Python 描述 1.2 编程元素

    摘要:程序用于在编程社群的成员之间交流这些想法。在编程中,我们处理两种元素函数和数据。在中,我们可以使用赋值语句来建立新的绑定,它包含左边的名称和右边的值。例如,它并不能处理赋值语句。这些图解的必要部分是函数的表示。 1.2 编程元素 来源:1.2 The Elements of Programming 译者:飞龙 协议:CC BY-NC-SA 4.0 编程语言是操作计算机来执行任务...

    CoorChice 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<