摘要:起步浮點數(shù)的一個普遍的問題是它們不能精確的表示十進制數(shù)。這是由于底層和標準通過自己的浮點單位去執(zhí)行算術時的特征??此朴懈F的小數(shù)在計算機的二進制表示里卻是無窮的。盡管代碼看起來比較奇怪,使用字符串來表示數(shù)字,但是支持所有常用的數(shù)學運算。
起步
浮點數(shù)的一個普遍的問題是它們不能精確的表示十進制數(shù)。
>>> a = 4.2 >>> b = 2.1 >>> a + b 6.300000000000001 >>> (a + b) == 6.3 False >>>
這是由于底層 CPU 和 IEEE 754 標準通過自己的浮點單位去執(zhí)行算術時的特征。看似有窮的小數(shù), 在計算機的二進制表示里卻是無窮的。
一般情況下,這一點點的小誤差是允許存在的。如果不能容忍這種誤差(比如金融領域),那么就要考慮用一些途徑來解決這個問題了。
Decimal使用這個模塊不會出現(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ù)學運算。 decimal 模塊允許你控制計算的每一方面,包括數(shù)字位數(shù)和四舍五入。在這樣做之前,需要創(chuàng)建一個臨時上下文環(huán)境來改變這種設定:
>>> 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ù)字自然也就用字符串來做展示和中轉。
總結總的來說,當涉及金融領域時,哪怕是一點小小的誤差在計算過程中都是不允許的。因此 decimal 模塊為解決這類問題提供了方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/40994.html
摘要:數(shù)據(jù)結構另一個角度看概述中絕大部分數(shù)據(jù)結構可以最終分解為三種類型標量序列映射。創(chuàng)建變量時不需要聲明數(shù)據(jù)類型的數(shù)據(jù)類型是整數(shù)而的數(shù)據(jù)類型是浮點數(shù)布爾值只有和兩種值支持三種運算。的浮點數(shù)實際上是雙精度浮點數(shù)即語言的類型。 Python數(shù)據(jù)結構——另一個角度看Python(概述) Python 中絕大部分數(shù)據(jù)結構可以最終分解為三種類型: 標量(Scaler), 序列(Sequence), ...
Python內置了整數(shù)、復數(shù)、浮點數(shù)三種數(shù)字類型。 整數(shù) 整數(shù)是沒有小數(shù)部分的數(shù)值,與數(shù)學上的一樣: >>> 1 1 >>> -1 -1 整數(shù)沒有大小限制,只要你的內存足夠大,就可以創(chuàng)建任意大小的整數(shù): >>> 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111...
摘要:又如,對于,結果其實并不是,但是最接近真實結果的數(shù),比其它任何浮點數(shù)都更接近。許多語言也就直接顯示結果為了,而不展示一個浮點數(shù)的真實結果了。小結本文主要介紹了浮點數(shù)計算問題,簡單回答了為什么以及怎么辦兩個問題為什么不等于。 原文地址:為什么0.1+0.2不等于0.3 先看兩個簡單但詭異的代碼: 0.1 + 0.2 > 0.3 // true 0.1 * 0.1 = 0.01000000...
摘要:也就是說不僅是會產生這種問題,只要是采用的浮點數(shù)編碼方式來表示浮點數(shù)時,則會產生這類問題。到這里我們都理解只要采取的浮點數(shù)編碼的語言均會出現(xiàn)上述問題,只是它們的標準類庫已經為我們提供了解決方案而已。 Brief 一天有個朋友問我JS中計算0.7 * 180怎么會等于125.99999999998,坑也太多了吧!那時我猜測是二進制表示數(shù)值時發(fā)生round-off error所導致,但并不...
摘要:本文通過介紹的二進制存儲標準來理解浮點數(shù)運算精度問題,和理解對象的等屬性值是如何取值的,最后介紹了一些常用的浮點數(shù)精度運算解決方案。浮點數(shù)精度運算解決方案關于浮點數(shù)運算精度丟失的問題,不同場景可以有不同的解決方案。 本文由云+社區(qū)發(fā)表 相信大家在平常的 JavaScript 開發(fā)中,都有遇到過浮點數(shù)運算精度誤差的問題,比如 console.log(0.1+0.2===0.3)// fa...
閱讀 2797·2021-11-24 09:39
閱讀 2558·2021-11-23 09:51
閱讀 1871·2021-11-17 09:33
閱讀 1752·2021-10-22 09:54
閱讀 1884·2021-08-16 11:00
閱讀 3436·2019-08-30 15:53
閱讀 1743·2019-08-30 13:19
閱讀 2915·2019-08-30 12:49