Python中如何用modf()函数取小数,取数错误怎么回事
Admin 2022-07-29 群英技术资讯 441 次浏览
如下
import math print(math.modf(2.4)) # 输出 (0.3999999999999999, 2.0)
我们会发现对2.4进行拆分得到的小数并不是0.4,这是因为什么呢?
这是因为计算机采用的是二进制代码,而二进制代码由于计算上的误差无法准确表示某些十进制数的小数部分。
我们知道一个十进制数转化为二进制数需要分为两部分进行计算:整数部分和小数部分。
整数部分采用“除二取余法”。将这个整数除以2,得到它的余数,然后将商再除以3,直到商为0为止,并将各个得到的余数按照相反的顺序进行排列。
小数部分采用“乘2取整法”,将这个小数乘2,将新得到的数的整数部分取出,再用2乘余下的小数部分,如此往复直到乘积中的小数部分为0或者达到要求的精度为止。并将取出的整数部分按照取出的先后顺序从前到后排列。
123/2=61...1 61/2=30...1 30/2=15...0 15/2=7...1 7/2=3...1 3/2=1...1 1/2=0...1 (123)10=(1111011)2 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 0.6*2=1.2...1 (0.4)10=(0.011001100110011001100110...)2 (123.4)2=(1111011.011001100110011...)2
十进制的0.4转化为二进制时会出现重复循环“0110”的情况,但是目前计算机存储浮点数是按照电器和电子工程师协会的标准(IEEE754浮点数存储格式标准)来进行存储的。
IEEE规定单精度浮点最多存储32位(4个字节):
31位是符号位。1表示该数为负,0为正
30~23是指数位(-128-127)
22~0是尾数位,尾数的编码一般是源码和补码
IEEE标准从逻辑上用三元组{S,E,M}表示一个数,如图所示:
也就是说上面将0.4转换出的二进制代码,我们只能存储23位,即使数据类型为double,也只能存储52位,这样大家便能看出问题出现的原因了。23位的数据显然无法完整表示0.4的二进制数据,于是误差产生了。
那所有的十进制小数都无法完整表示吗?不是的,只要小数部分乘上2最终小数部分能够得到0就不会出现这种问题,比如0.5,0.75。
import math print(math.modf(1.5)) # 输出 (0.5,1.0)
0.5*2=1...1 (0.5)10=(0.1)2 0.75*2=1.5...1 0.5*2=1...1 (0.75)10=(0.11)2
补充:Python中“取整”的各种问题
有时候我们分页展示数据的时候,需要计算页数。一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 页。
一般的除法只是取整数部分,达不到要求。
UP(A/B) = int((A+B-1)/B)
取临界值,计算下A+B-1的范围就OK.
首先要说的是python中的除法运算,
当使用x/y形式进行除法运算时,那么会进行所谓的true除法,比如2.0/3的结果是 0.66666666666666663。
另外一种除法是采用x//y的形式(向下取整),那么这里采用的是所谓floor除法,即得到不大于结果的最大整数值,这个运算时与操作数无关的。比如2//3的结果是0,-2//3的结果是-1,-2.0//3的结果是-1.0。
在python 3.0中,x/y将只执行true除法,而与操作数无关;x//y则执行floor除法。
Python运算向上取整方法:(A+B-1)/B
ceil(x)函数是向上取整,即取大于等于x的最接近整数。
import math math.ceil(float(205)/20) import numpy as np np.ceil(float(205)/20)
import numpy as np n = np.array([-1.7, -2.5, -0.2, 0.6, 1.2, 2.7, 11]) floor = np.floor(n) print(floor) # [ -2. -3. -1. 0. 1. 2. 11.]
A=100 B=16 c=100//16 (c=6)
np.around 返回四舍五入后的值,可指定精度。
around(a, decimals=0, out=None)
a 输入数组
decimals 要舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
import numpy as np n = np.array([-0.746, 4.6, 9.4, 7.447, 10.455, 11.555]) around1 = np.around(n) print(around1) # [ -1. 5. 9. 7. 10. 12.] around2 = np.around(n, decimals=1) print(around2) # [ -0.7 4.6 9.4 7.4 10.5 11.6] around3 = np.around(n, decimals=-1) print(around3) # [ -0. 0. 10. 10. 10. 10.]
math模块中的 modf()方法
将整数部分和小数部分分别取出,可以使用math模块中的 modf()方法
例如:
>>> math.modf(4.25) (0.25, 4.0) >>> math.modf(4.33)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了Python Django搭建文件下载服务器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
任何编程语言都需要处理数据,比如数字、字符串、字符等,我们可以直接使用数据,也可以将数据保存到变量中,方便以后使用。本文主要介绍了python定义变量类型,感兴趣的可以了解一下
python循环与判断语句怎样写,有哪些注意事项?下文的讲解详细,步骤过程清晰,对大家进一步学习和理解相关知识有一定的帮助。有这方面学习需要的朋友就继续往下看吧!
这篇文章主要介绍了Python 高级教程之线程进程和协程的代码解析,包括使用线程模块的简单示例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
这篇文章主要介绍了python倒序for循环实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008