国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

python中精確的浮點(diǎn)數(shù)運(yùn)算

xiangzhihong / 2114人閱讀

摘要:起步浮點(diǎn)數(shù)的一個(gè)普遍的問題是它們不能精確的表示十進(jìn)制數(shù)。這是由于底層和標(biāo)準(zhǔn)通過自己的浮點(diǎn)單位去執(zhí)行算術(shù)時(shí)的特征??此朴懈F的小數(shù)在計(jì)算機(jī)的二進(jìn)制表示里卻是無窮的。盡管代碼看起來比較奇怪,使用字符串來表示數(shù)字,但是支持所有常用的數(shù)學(xué)運(yùn)算。

起步

浮點(diǎn)數(shù)的一個(gè)普遍的問題是它們不能精確的表示十進(jìn)制數(shù)。

>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
>>>

這是由于底層 CPU 和 IEEE 754 標(biāo)準(zhǔn)通過自己的浮點(diǎn)單位去執(zhí)行算術(shù)時(shí)的特征??此朴懈F的小數(shù), 在計(jì)算機(jī)的二進(jìn)制表示里卻是無窮的。

一般情況下,這一點(diǎn)點(diǎn)的小誤差是允許存在的。如果不能容忍這種誤差(比如金融領(lǐng)域),那么就要考慮用一些途徑來解決這個(gè)問題了。

Decimal

使用這個(gè)模塊不會(huì)出現(xiàn)任何小誤差。

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

盡管代碼看起來比較奇怪,使用字符串來表示數(shù)字,但是 Decimal 支持所有常用的數(shù)學(xué)運(yùn)算。 decimal 模塊允許你控制計(jì)算的每一方面,包括數(shù)字位數(shù)和四舍五入。在這樣做之前,需要?jiǎng)?chuàng)建一個(gè)臨時(shí)上下文環(huán)境來改變這種設(shè)定:

>>> from decimal import Decimal, localcontext
>>> a = Decimal("1.3")
>>> b = Decimal("1.7")
>>> print(a / b)
0.7647058823529411764705882353
>>> with localcontext() as ctx:
...     ctx.prec = 3
...     print(a / b)
...
0.765
>>> with localcontext() as ctx:
...     ctx.prec = 50
...     print(a / b)
...
0.76470588235294117647058823529411764705882352941176
>>>

由于 Decimal 的高精度數(shù)字自然也就用字符串來做展示和中轉(zhuǎn)。

總結(jié)

總的來說,當(dāng)涉及金融領(lǐng)域時(shí),哪怕是一點(diǎn)小小的誤差在計(jì)算過程中都是不允許的。因此 decimal 模塊為解決這類問題提供了方法。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40994.html

相關(guān)文章

  • Python數(shù)據(jù)結(jié)構(gòu)——另一個(gè)角度看Python(概述)

    摘要:數(shù)據(jù)結(jié)構(gòu)另一個(gè)角度看概述中絕大部分?jǐn)?shù)據(jù)結(jié)構(gòu)可以最終分解為三種類型標(biāo)量序列映射。創(chuàng)建變量時(shí)不需要聲明數(shù)據(jù)類型的數(shù)據(jù)類型是整數(shù)而的數(shù)據(jù)類型是浮點(diǎn)數(shù)布爾值只有和兩種值支持三種運(yùn)算。的浮點(diǎn)數(shù)實(shí)際上是雙精度浮點(diǎn)數(shù)即語言的類型。 Python數(shù)據(jù)結(jié)構(gòu)——另一個(gè)角度看Python(概述) Python 中絕大部分?jǐn)?shù)據(jù)結(jié)構(gòu)可以最終分解為三種類型: 標(biāo)量(Scaler), 序列(Sequence), ...

    big_cat 評(píng)論0 收藏0
  • Python標(biāo)準(zhǔn)數(shù)據(jù)類型-數(shù)字

    Python內(nèi)置了整數(shù)、復(fù)數(shù)、浮點(diǎn)數(shù)三種數(shù)字類型。 整數(shù) 整數(shù)是沒有小數(shù)部分的數(shù)值,與數(shù)學(xué)上的一樣: >>> 1 1 >>> -1 -1 整數(shù)沒有大小限制,只要你的內(nèi)存足夠大,就可以創(chuàng)建任意大小的整數(shù): >>> 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...

    svtter 評(píng)論0 收藏0
  • 為什么0.1+0.2不等于0.3

    摘要:又如,對(duì)于,結(jié)果其實(shí)并不是,但是最接近真實(shí)結(jié)果的數(shù),比其它任何浮點(diǎn)數(shù)都更接近。許多語言也就直接顯示結(jié)果為了,而不展示一個(gè)浮點(diǎn)數(shù)的真實(shí)結(jié)果了。小結(jié)本文主要介紹了浮點(diǎn)數(shù)計(jì)算問題,簡單回答了為什么以及怎么辦兩個(gè)問題為什么不等于。 原文地址:為什么0.1+0.2不等于0.3 先看兩個(gè)簡單但詭異的代碼: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...

    Profeel 評(píng)論0 收藏0
  • JS魔法堂:徹底理解0.1 + 0.2 === 0.30000000000000004的背后

    摘要:也就是說不僅是會(huì)產(chǎn)生這種問題,只要是采用的浮點(diǎn)數(shù)編碼方式來表示浮點(diǎn)數(shù)時(shí),則會(huì)產(chǎn)生這類問題。到這里我們都理解只要采取的浮點(diǎn)數(shù)編碼的語言均會(huì)出現(xiàn)上述問題,只是它們的標(biāo)準(zhǔn)類庫已經(jīng)為我們提供了解決方案而已。 Brief 一天有個(gè)朋友問我JS中計(jì)算0.7 * 180怎么會(huì)等于125.99999999998,坑也太多了吧!那時(shí)我猜測是二進(jìn)制表示數(shù)值時(shí)發(fā)生round-off error所導(dǎo)致,但并不...

    JerryWangSAP 評(píng)論0 收藏0
  • JS如何理解浮點(diǎn)數(shù)

    摘要:本文通過介紹的二進(jìn)制存儲(chǔ)標(biāo)準(zhǔn)來理解浮點(diǎn)數(shù)運(yùn)算精度問題,和理解對(duì)象的等屬性值是如何取值的,最后介紹了一些常用的浮點(diǎn)數(shù)精度運(yùn)算解決方案。浮點(diǎn)數(shù)精度運(yùn)算解決方案關(guān)于浮點(diǎn)數(shù)運(yùn)算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過浮點(diǎn)數(shù)運(yùn)算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...

    bang590 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<