python计算四舍五入_Python实现小数四舍五入的方法

对小数在Python中实现四舍五入的方法,不能使用round函数,round函数的执行的是HALF EVEN,不是四舍五入(HALF UP)。而使用decimal模块提供的接口,就可以精确实现十进制小数的四舍五入。本文对这个topic进行详细介绍。

Python的浮点数

说到小数,程序员的第一反应可能就是想到了浮点数,小数和浮点数是两个概念。Python中的浮点数,float对象,对应的是机器底层的双精度浮点数。这意味着,float对象的值,并不是一个精确的值!比如:

>>> 0.1 + 0.1 + 0.1 == 0.3

False

>>> 0.1 + 0.2

0.30000000000000004

所以,对于float对象的数值比较操作,要格外小心,原则上浮点数是不能使用 == 来判断的。

浮点数是一个计算机底层概念,它就是代表不精确的小数,因为计算机有表示数据方面的硬件限制(参考:IEEE754浮点数)。而我们日常说的小数,就是带小数点的数。每一个小数,在计算机中,都有一个近似的浮点数的表示!

round函数执行银行家舍入法(HALF EVEN)

round是一个Python的标准内置函数,round在英文里,就是对某个数进行舍入截取的意思,而舍入截取的方式有很多,四舍五入只是其中一种。从Python官方文档的说明中,我们可以知道,round函数执行的是HALF EVEN,而不是四舍五入(HALF UP)。

先看几个round函数的整数结果测试用例:

>>> >>> round(-0.5)

0

>>> round(0.5)

0

>>> round(2.5)

2

>>> round(1.5)

2

HALF EVEN的含义,就是在对一个数进行round的时候,如果这个数与两边的数距离相等,就选择偶数。就是上面的例子,对0.5取整,0.5到0的距离与到1的距离相等,于是,round函数就选择了0这个偶数。HALF EVEN被称为银行家舍入法,它的另一条规则是,向最近的数字舍入!

我们再来看几个round函数小数结果的例子:

看看高亮的3-6行,round函数都干了些什么......我们要来分别看一下3.48,3.15,2.15以及5.15这四个小数对应的浮点数是什么样的,就明白了:

decimal模块的Decimal对象,可以将float数据,映射为底层的更精确的表示。

小数3.15的浮点数表示是3.1499999.....保留小数点后1位,向最近的数字舍入,就是3.1;

小数2.15的浮点数表示是2.1499999.....保留小数点后1位,向最近的数字舍入,就是2.1;

round函数没有做错!看起来错在了float对象的不精确表示上面。(计算机无法用二进制来精确的表示十进制的小数)

因此,在一些对精度要求不是很高的地方,我们可以使用round函数来做HALF EVEN的舍入。如果对精度要求很高呢?如果我们就是要对小数3.15做小数点后1位的四舍五入,得到3.2,应该怎么办呢?

用decimal模块的接口做四舍五入

使用decimal模块的接口,可以实现小数精确的四舍五入。decimal模块是Python的一个标准库,是专门为十进制小数的精确计算而设计的。用decimal模块做十进制小数的计算,是符合直觉的:

>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') == Decimal('0.3')

True

>>> Decimal('0.1') + Decimal('0.2')

Decimal('0.3')

本文不对decimal模块做过多介绍,只说明如何用它来做小数的精确的四舍五入,请看如下代码:

>>> Decimal('2.15').quantize(Decimal('.0'), rounding=ROUND_HALF_UP)

Decimal('2.2')

>>> Decimal('3.15').quantize(Decimal('.0'), rounding=ROUND_HALF_UP)

Decimal('3.2')

>>> Decimal('3.14159265').quantize(Decimal('.0000'), rounding=ROUND_HALF_UP)

Decimal('3.1416')

>>> Decimal('3.14159265').quantize(Decimal('.000'), rounding=ROUND_HALF_UP)

Decimal('3.142')

>>> Decimal('3.14159265').quantize(Decimal('.00'), rounding=ROUND_HALF_UP)

Decimal('3.14')

>>> str(Decimal('3.14'))

'3.14'

使用quantize成员函数,第1个参数指定了精度,关键是第2个参数,指定了截取的方式,ROUND_HALF_UP,就是四舍五入!最后,可以轻松将Decimal对象转换成字符串。

以上就是对于在Python中实现小数的四舍五入的方法介绍,希望能被您喜欢...

-- EOF --

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一位像素艺术家用39张动图,将大自然的唯美尽收眼底…

Lioness 是一位像素艺术家,会制作 Gifs、icons、实体模型以及像素艺术教程等等。但其实,他的大部分精力集中在大自然灵感艺术,“Natural Palettes”便是其中一个项目。在这个项目里面,除了常见的配色图片以外,以 GIF 形…

一起学习设计模式--02.简单工厂模式

工厂模式是最常用的一类创建型设计模式。我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。简单工厂模式是工厂方法模式的小弟,它不属于GoF 23种设计模式,但是在软件开发中应用也颇为频繁,通常将它作为学习其它…

python list remove 删除引用_Python——list列表操作一坑(remove)

问题发生背景:在一个对象被调用多次时候对象存入了列表暂时保存(主流程不能断开使用了while True),然后实例化了大批对象,具体你可参考打飞机游戏或者坦克大战发射子弹,每个子弹一个实例,创建的多到一定时候肯定是要释…

雨后漫步长安街

雨后漫步长安街,四处是祖国60华诞的味道,和城楼合个影,待百年庆典的时候拿出来看一定别有一番滋味。那时我都是老婆婆了……转载于:https://blog.51cto.com/xurui/200059

hive 导入mysql数据库_求助 Hive 导入MYsql 数据库 报错啊

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼sqoop export \--connect "jdbc:mysql://localhost:3306/emp?characterEncodingUTF8" \--username root \--password 123456 \--input-fields-terminated-by , \--table t_dim_sqoop \--export-dir /user/hive/warehous…

聊一聊Load Average

背景 前段时间,由于有几个应用引入了 prometheus-net.DotNetRuntime 这个组件,导致系统 CPU 间歇性飙升。这是这个组件一个已知的雷。。同样也引发了系统的 Load Average (平均负载) 十分不正常。这是一台 4C8G 的服务器,Load Average 却是达…

我的邮局系统,欢迎大家注册!hotxf.com

我的邮局系统,欢迎大家注册!hotxf.com mail.hotxf.com 可用于登陆MSN和邮件,25G网络硬盘我在使用 Windows Live 为 hotxf.com 托管电子邮件。我想邀请您在 hotxf.com 中创建电子邮件地址。您可以通过单击 https://domains.live.com/m…

优雅的读懂支持向量机 SVM 算法

转自:JerryLeadhttp://www.cnblogs.com/jerrylead/archive/2011/03/13/1982639.html简介支持向量机基本上是最好的有监督学习算法了。最开始接触SVM是去年暑假的时候,老师要求交《统计学习理论》的报告,那时去网上下了一份入门教程&#xff0…

python socket自动重连_详解python3中socket套接字的编码问题解决

一、TCP1、tcp服务器创建#创建服务器from socket import *from time import ctime #导入ctimeHOST #任意主机PORT 21567 #随机提供个端口号BUFSIZ 1024 # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量ADDR (HOST, PORT)tcpSerSock socket(AF_…

java压缩成.tar_java压缩tar.gz | 学步园

zlib、gzip、zip这三个概念的确比较容易混淆:zlib是一种数据压缩程序库,它的设计目标是处理单纯的数据(而不管数据的来源是什么)。gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格式),它的设计目标是处理单个的文件。gzip在压缩文件中的…

CentOS 介绍

CentOS是Community ENTerprise Operating System的简称,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是linux的一个发行版本。CentOS并不是全新的linux发行版,倘若一说到RedHat这个大名,大家似乎都听过&…

Newbe.Claptrap 0.9.4 发布,全新构建

Newbe.Claptrap 0.9.4 发布,全新构建,全新内容,全新体验。简介 此次的版本更新虽然只是一个副版本更新。但实际上我们带来了非常多全新的内容。全方位将本框架带入到一个新的次代。我们希望我们的努力可以为在业务中需要 Actor 模式的开发者带…

【知识贴】战争中的数学应用

一、方程在海湾战争中的应用

Android Donut SDK 1.6r1 今日发布

Google今天公布了新版Android SDK,也就是Donut的最新1.6版,它可以帮助智能手机应用程序开发商迅速将自己的应用转换到Android系统上. SDK的发布有助于Google为自己寻找到更多的合作伙伴,为自己的Android Market添加人气,目前Donut已经可以下载. 下载:Android 1.6 SDK

java让对象分配在栈上_java – Hotspot何时可以在堆栈上分配对象?

我做了一些实验,以便了解Hotspot何时可以进行堆栈分配.事实证明,它的堆栈分配比基于available documentation的预期要有限得多.Choi“Escape Analysis for Java”引用的文章表明,只分配给局部变量的对象总是可以堆栈分配.但事实并非如此.所有这些都是当前Hotspot实现的实现细节…

开始CSRebot

写代码很久了了,时不时想把这些年学到的,用到的,或自己感悟到的,汇总一下,形成一个东西,或资料,或工具。但每当开始时就一片空白,总是觉得这些大家都会,这些只是自己片面…

toast弹窗_Android 开发(一):Toast弹窗与获取控件的值

前言:本人也是刚接触Android开发,自己也在摸索中,在实现功能的过程中走了不少弯路,其中很重要的原因之一就是查询不到想要的内容,所以想把自己的经验分享出来。首先是Toast的应用,直接上关键代码。Toast to…

魔性十足的数学动态图,这种东西都拿出来分享?

小编最近发现了一组超美的与数学有关的动态图,而且看久了简直就有魔性,实在是按耐不住激动的心情,秉持着好图齐分享的原则,在这里和大家一起分享一波~>>>>来源:蒋迅的博客

Command模式

作用: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作. UML结构图: 解析: Comnand模式的思想是把命令封装在一个类中,就是这里的Command基类,同时把接收对象也封装在一个类中就是这里的Receiver 类中,由调用…

Dapr微服务应用开发系列4:状态管理构件块

Dapr微服务应用开发系列0:概述Dapr微服务应用开发系列1:环境配置Dapr微服务应用开发系列2:Hello World与SDK初接触Dapr微服务应用开发系列3:服务调用构件块题记:这篇介绍状态管理构件块,这个概念相对于微服…