欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決Python中的modf()函數(shù)取小數(shù)部分不準(zhǔn)確問(wèn)題

 更新時(shí)間:2021年05月28日 08:47:04   作者:可樂(lè)味的鼻涕  
這篇文章主要介紹了解決Python中的modf()函數(shù)取小數(shù)部分不準(zhǔn)確問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用math.modf()對(duì)一個(gè)浮點(diǎn)數(shù)進(jìn)行拆分時(shí)經(jīng)常會(huì)遇到如下情況

如下

import math
print(math.modf(2.4)) # 輸出 (0.3999999999999999, 2.0)

我們會(huì)發(fā)現(xiàn)對(duì)2.4進(jìn)行拆分得到的小數(shù)并不是0.4,這是因?yàn)槭裁茨兀?/p>

這是因?yàn)橛?jì)算機(jī)采用的是二進(jìn)制代碼,而二進(jìn)制代碼由于計(jì)算上的誤差無(wú)法準(zhǔn)確表示某些十進(jìn)制數(shù)的小數(shù)部分。

下面我們具體來(lái)講一下。

我們知道一個(gè)十進(jìn)制數(shù)轉(zhuǎn)化為二進(jìn)制數(shù)需要分為兩部分進(jìn)行計(jì)算:整數(shù)部分和小數(shù)部分。

整數(shù)部分采用“除二取余法”。將這個(gè)整數(shù)除以2,得到它的余數(shù),然后將商再除以3,直到商為0為止,并將各個(gè)得到的余數(shù)按照相反的順序進(jìn)行排列。

小數(shù)部分采用“乘2取整法”,將這個(gè)小數(shù)乘2,將新得到的數(shù)的整數(shù)部分取出,再用2乘余下的小數(shù)部分,如此往復(fù)直到乘積中的小數(shù)部分為0或者達(dá)到要求的精度為止。并將取出的整數(shù)部分按照取出的先后順序從前到后排列。

 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

十進(jìn)制的0.4轉(zhuǎn)化為二進(jìn)制時(shí)會(huì)出現(xiàn)重復(fù)循環(huán)“0110”的情況,但是目前計(jì)算機(jī)存儲(chǔ)浮點(diǎn)數(shù)是按照電器和電子工程師協(xié)會(huì)的標(biāo)準(zhǔn)(IEEE754浮點(diǎn)數(shù)存儲(chǔ)格式標(biāo)準(zhǔn))來(lái)進(jìn)行存儲(chǔ)的。

IEEE規(guī)定單精度浮點(diǎn)最多存儲(chǔ)32位(4個(gè)字節(jié)):

31位是符號(hào)位。1表示該數(shù)為負(fù),0為正

30~23是指數(shù)位(-128-127)

22~0是尾數(shù)位,尾數(shù)的編碼一般是源碼和補(bǔ)碼

IEEE標(biāo)準(zhǔn)從邏輯上用三元組{S,E,M}表示一個(gè)數(shù),如圖所示:

在這里插入圖片描述

也就是說(shuō)上面將0.4轉(zhuǎn)換出的二進(jìn)制代碼,我們只能存儲(chǔ)23位,即使數(shù)據(jù)類型為double,也只能存儲(chǔ)52位,這樣大家便能看出問(wèn)題出現(xiàn)的原因了。23位的數(shù)據(jù)顯然無(wú)法完整表示0.4的二進(jìn)制數(shù)據(jù),于是誤差產(chǎn)生了。

那所有的十進(jìn)制小數(shù)都無(wú)法完整表示嗎?不是的,只要小數(shù)部分乘上2最終小數(shù)部分能夠得到0就不會(huì)出現(xiàn)這種問(wèn)題,比如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

補(bǔ)充:Python中“取整”的各種問(wèn)題

一、初衷:

有時(shí)候我們分頁(yè)展示數(shù)據(jù)的時(shí)候,需要計(jì)算頁(yè)數(shù)。一般都是向上取整,例如counts=205 pageCouts=20 ,pages= 11 頁(yè)。

一般的除法只是取整數(shù)部分,達(dá)不到要求。

二、方法:

1、通用除法:

UP(A/B) = int((A+B-1)/B)

取臨界值,計(jì)算下A+B-1的范圍就OK.

2 、Python除法:

首先要說(shuō)的是python中的除法運(yùn)算,

當(dāng)使用x/y形式進(jìn)行除法運(yùn)算時(shí),那么會(huì)進(jìn)行所謂的true除法,比如2.0/3的結(jié)果是 0.66666666666666663。

另外一種除法是采用x//y的形式(向下取整),那么這里采用的是所謂floor除法,即得到不大于結(jié)果的最大整數(shù)值,這個(gè)運(yùn)算時(shí)與操作數(shù)無(wú)關(guān)的。比如2//3的結(jié)果是0,-2//3的結(jié)果是-1,-2.0//3的結(jié)果是-1.0。

在python 3.0中,x/y將只執(zhí)行true除法,而與操作數(shù)無(wú)關(guān);x//y則執(zhí)行floor除法。

Python運(yùn)算向上取整方法:(A+B-1)/B

3、Python match.ceil函數(shù) np.ceil函數(shù)

ceil(x)函數(shù)是向上取整,即取大于等于x的最接近整數(shù)。

import math 
math.ceil(float(205)/20) 
import numpy as np
np.ceil(float(205)/20)

Python 向上取整的算法

1、一般使用floor除法 (np.floor()或者math.floor())

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.]

2、一般除法/

A=100
B=16
c=100//16
(c=6)

3、round()四舍五入函數(shù)。

np.around 返回四舍五入后的值,可指定精度。

around(a, decimals=0, out=None)

a 輸入數(shù)組

decimals 要舍入的小數(shù)位數(shù)。 默認(rèn)值為0。 如果為負(fù),整數(shù)將四舍五入到小數(shù)點(diǎn)左側(cè)的位置

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.]

Python 分別取整的算法

math模塊中的 modf()方法

將整數(shù)部分和小數(shù)部分分別取出,可以使用math模塊中的 modf()方法

例如:

>>> math.modf(4.25)
(0.25, 4.0)
>>> math.modf(4.33)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼

    Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼

    這篇文章主要介紹了Python自定義類的數(shù)組排序?qū)崿F(xiàn)代碼,需要的朋友可以參考下
    2016-08-08
  • Python基于locals返回作用域字典

    Python基于locals返回作用域字典

    這篇文章主要介紹了Python基于locals返回作用域字典,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • python爬蟲(chóng)之線程池和進(jìn)程池功能與用法詳解

    python爬蟲(chóng)之線程池和進(jìn)程池功能與用法詳解

    這篇文章主要介紹了python爬蟲(chóng)之線程池和進(jìn)程池功能與用法,結(jié)合實(shí)例形式分析了Python基于線程池與進(jìn)程池的爬蟲(chóng)功能相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2018-08-08
  • Python3.5 Pandas模塊之Series用法實(shí)例分析

    Python3.5 Pandas模塊之Series用法實(shí)例分析

    這篇文章主要介紹了Python3.5 Pandas模塊之Series用法,結(jié)合實(shí)例形式分析了Python3.5中Pandas模塊的Series結(jié)構(gòu)原理、創(chuàng)建、獲取、運(yùn)算等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • python批量生成條形碼的示例

    python批量生成條形碼的示例

    這篇文章主要介紹了python批量生成條形碼的示例,幫助大家更好的利用python處理圖形,感興趣的朋友可以了解下
    2020-10-10
  • Django返回json數(shù)據(jù)用法示例

    Django返回json數(shù)據(jù)用法示例

    這篇文章主要介紹了Django返回json數(shù)據(jù)用法,結(jié)合實(shí)例形式分析了jQuery通過(guò)前端ajax發(fā)送get請(qǐng)求及后臺(tái)使用Django接收GET請(qǐng)求并返回處理的json數(shù)據(jù)相關(guān)技巧,需要的朋友可以參考下
    2016-09-09
  • Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐

    Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐

    這篇文章主要介紹了Python 使用 attrs 和 cattrs 實(shí)現(xiàn)面向?qū)ο缶幊痰膶?shí)踐,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Python腳本提取fasta文件單序列信息實(shí)現(xiàn)

    Python腳本提取fasta文件單序列信息實(shí)現(xiàn)

    這篇文章主要為大家介紹了Python腳本提取fasta文件單序列信息實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Django1.9 加載通過(guò)ImageField上傳的圖片方法

    Django1.9 加載通過(guò)ImageField上傳的圖片方法

    今天小編就為大家分享一篇Django1.9 加載通過(guò)ImageField上傳的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python文件的讀取、寫(xiě)入與刪除

    python文件的讀取、寫(xiě)入與刪除

    文件是無(wú)處不在的,,無(wú)論我們使用哪種編程語(yǔ)言,處理文件對(duì)于每個(gè)程序員都是必不可少的,下面這篇文章主要給大家介紹了關(guān)于python文件的讀取、寫(xiě)入與刪除的相關(guān)資料,文中通過(guò)實(shí)例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評(píng)論