谈谈关于Python里面小数点精度控制的问题

基础

浮点数是用机器上浮点数的本机双精度(64 bit)表示的。提供大约17位的精度和范围从-308到308的指数。和C语言里面的double类型相同。Python不支持32bit的单精度浮点数。如果程序需要精确控制区间和数字精度,可以考虑使用numpy扩展库。

Python 3.X对于浮点数默认的是提供17位数字的精度。

关于单精度和双精度的通俗解释:

单精度型和双精度型,其类型说明符为float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。

要求较小的精度

将精度高的浮点数转换成精度低的浮点数。

1.round()内置方法

这个是使用最多的,刚看了round()的使用解释,也不是很容易懂。round()不是简单的四舍五入的处理方式。

For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2).

>>> round(2.5)
2
>>> round(1.5)
2
>>> round(2.675)
3
>>> round(2.675, 2)
2.67

round()如果只有一个数作为参数,不指定位数的时候,返回的是一个整数,而且是最靠近的整数(这点上类似四舍五入)。但是当出现.5的时候,两边的距离都一样,round()取靠近的偶数,这就是为什么round(2.5) = 2。当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的这样情况,如果要取舍的位数前的小树是奇数,则直接舍弃,如果偶数这向上取舍。看下面的示例:

>>> round(2.635, 2)
2.63
>>> round(2.645, 2)
2.65
>>> round(2.655, 2)
2.65
>>> round(2.665, 2)
2.67
>>> round(2.675, 2)
2.67

2. 使用格式化

效果和round()是一样的。

>>> a = ("%.2f" % 2.635)
>>> a
'2.63'
>>> a = ("%.2f" % 2.645)
>>> a
'2.65'
>>> a = int(2.5)
>>> a
2

要求超过17位的精度分析

python默认的是17位小数的精度,但是这里有一个问题,就是当我们的计算需要使用更高的精度(超过17位小数)的时候该怎么做呢?

1. 使用格式化(不推荐)

>>> a = "%.30f" % (1/3)
>>> a
'0.333333333333333314829616256247'

可以显示,但是不准确,后面的数字往往没有意义。

2. 高精度使用decimal模块,配合getcontext

>>> from decimal import *
>>> print(getcontext())
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> getcontext().prec = 50
>>> b = Decimal(1)/Decimal(3)
>>> b
Decimal('0.33333333333333333333333333333333333333333333333333')
>>> c = Decimal(1)/Decimal(17)
>>> c
Decimal('0.058823529411764705882352941176470588235294117647059')
>>> float(c)
0.058823529411764705

默认的context的精度是28位,可以设置为50位甚至更高,都可以。这样在分析复杂的浮点数的时候,可以有更高的自己可以控制的精度。其实可以留意下context里面的这rounding=ROUND_HALF_EVEN 参数。ROUND_HALF_EVEN, 当half的时候,靠近even.

关于小数和取整

既然说到小数,就必然要说到整数。一般取整会用到这些函数:

1. round()

这个不说了,前面已经讲过了。一定要注意它不是简单的四舍五入,而是ROUND_HALF_EVEN的策略。

2. math模块的ceil(x)

取大于或者等于x的最小整数。

3. math模块的floor(x)

去小于或者等于x的最大整数。

>>> from math import ceil, floor
>>> round(2.5)
2
>>> ceil(2.5)
3
>>> floor(2.5)
2
>>> round(2.3)
2
>>> ceil(2.3)
3
>>> floor(2.3)
2
>>>
(0)

相关推荐

  • 【编程课堂】震惊!小 bug 引发大灾难,0.1 + 0.2 的结果竟然是……

    各位观众点进标题看文章的时候,我已经准备打包行李去UC报道啦~ 冷笑话结束,嗯,说正事.请大家思考一下在 python 控制台输入  0.1 + 0.2 == 0.3 ,返回的结果是什么?手边有电脑的 ...

  • 单精度、双精度、多精度和混合精度计算的区别是什么?

    我们学过数学,都知道有理数和无理数,然后在有理数中有一类叫浮点数的数字,不知道大家对这些还有没有印象? 在软件编程的时候,我们也会用到浮点数,一种既包含小数又包含整数的数据类型. 下面就来讲讲关于浮点 ...

  • 机械加工几何精度控制方案

    编者按 本文从工件.刀具.夹具和机床等4个方面对机械加工中几何尺寸超差问题的解决方案进行详细梳理和归类,并提出几点建议. 1 序 言 在机械加工中,由机床.夹具.刀具和工件组成的统一体称为工艺系统.在 ...

  • 跟光磊学Python开发程序流程控制

    https://m.toutiao.com/is/JTDYwKQ/ 程序流程控制概述 程序分为三种执行结构: 顺序结构:即从上到下依次执行,之前编写的Phthon都是顺序结构 分支结构:根据条件成立, ...

  • 【Python面试】谈谈对 Python 和其他语言的区别?​

    最近公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开 ...

  • 案例 | 近600米射电望远镜如何将精度控制在0.3毫米

    RATAN-600射电望远镜,位于俄罗斯泽连楚克斯卡雅,海拔高度970米.直径576米,由895块矩形射电望远镜反射板及其对应的二级反射器及接收器组成,是世界上最大的单口径射电望远镜. RATAN-6 ...

  • 谈谈车辆系统的启动与停止控制(下)

    Matlab只是一个工具,真正重要的东西是在脑子里面形成的想法和控制策略. 上一讲,笔者根据需求,尝试着描述了"车辆系统的启动与停止"软件架构草图并搭建了详细的控制策略模型,同时对 ...

  • 谈谈车辆系统的启动与停止控制(中)

    Matlab只是一个工具,真正重要的东西是在脑子里面形成的想法和控制策略. 上一讲,笔者将"车辆系统启动与停止控制"大脑中形成的想法(需求)进行了详细讲解,本次会根据上一讲得出的需 ...

  • 谈谈车辆系统的启动与停止控制(上)

    Matlab只是一个工具,真正重要的东西是在脑子里面形成的想法和控制策略. 对混合动力车辆而言,系统的启动(上电)与停止(下电)是十分重要的控制.因为,无论是行驶控制.模式切换.动力分配.能量管理.附 ...

  • (1条消息) 程序员:利用Python实现可控制肉鸡的反向Shell

    一.初识 1.1 用 Python 实现一个可以管理多个肉鸡的反向 Shell,为什么叫反向 Shell 呢?反向就是肉鸡作为 Client 主动连接到我们的 Server 端,以实现对多个远程主机的 ...

  • selenium+python自动化87-Chrome正在受到自动软件的控制

    一.出现问题 1.用selenium启动浏览器出现'Chrome正在受到自动软件的控制' 2.如果不想看到这种讨厌的提示语,启动浏览器时候加个配置就行了 二.disable-infobars 1.在浏 ...