python2.4開始引入一種新的核心資料型別:小數物件。 比其他資料型別複雜一些,小數是通過通過乙個匯入的模組呼叫函式後建立,而不是通過執行常量表示式來建立。從功能上來說,小數物件就像浮點數,只不過它們有固定的位數和小數點,因此小數是有固定的精度的浮點數。
使用了小數物件,我們能夠使用乙個只保留兩位小數字精度的浮點數。此外,我們能夠定義如何省略和截斷額外的小數數字。儘管它對平常的浮點數型別來說帶來了微小的效能損失,小數型別對表現固定精度的特性(例如,錢的總和)以及對實現更好的數字精度是乙個理想的工具。
>>> 0.1 + 0.1 + 0.1 - 0.3
5.551115123125783e-17
>>> print(0.1 + 0.1 + 0.1 - 0.3)
5.551115123125783e-17
>>>
上面的計算結果或列印本應該得到0,結果卻是乙個接近0的數字,我們都知道,這是因為與硬體相關的浮點數運算在精度方面的內在的缺陷! 如果在數字要求很嚴格的地方,比如銀行顯然是不允許的。上述問題,如果使用小數物件,是可以解決的
>>> from decimal import decimal
>>> decimal("0.1") + decimal("0.1") + decimal("0.1") - decimal("0.3")
decimal('0.0')
>>>
decimal函式還可以隨著輸入的小數字數,自動公升級位數:
>>> decimal("0.1") + decimal("0.10") + decimal("0.10") - decimal("0.30")
decimal('0.00')
>>>
decimal模組中的其他工具還可以用來設定所有小數數值的精度、設定錯誤處理等。 例如,這個模組中的乙個上下文物件允許物件指定精度和捨入模式。 該精度全域性性地適用於呼叫執行緒中建立的所有小數:
>>> from decimal import decimal # 未設定精度
>>> decimal(1) / decimal(7)
decimal('0.1428571428571428571428571429')
>>> decimal.getcontext().prec = 2 # 設定精度為2
>>> decimal(1) / decimal(7)
decimal('0.14')
>>>
這對於處理貨幣的應用程式特別有用,其中,美分表示為兩個小數字數。這個上下文裡,小數實際上是手動捨入和字串格式化的一種替代方式:
>>> 1999 + 1.33
2000.33
>>> decimal.getcontext().prec = 2
>>> pay = decimal.decimal(str(1999 + 1.33))
>>> pay
decimal('2000.33')
>>>
python 2.6及之後的版本,可使用上下文管理器語句來重新設定臨時精度。和前面比較起來,優點在於:在語句退出後,精度又重新設定為初始值。
>>> import decimal
>>> decimal.decimal("1.00") / decimal.decimal("3.00")
decimal('0.33333333')
>>> with decimal.localcontext() as ctx: # 上下文管理器
... ctx.prec = 2
... decimal.decimal("1.00") / decimal.decimal("3.00")
decimal('0.33')
>>> decimal.decimal("1.00") / decimal.decimal("3.00") # 設定完不影響後面設定
decimal('0.33333333')
>>>
關於Python中小資料池的理解
1 首先理解 is 和 的區別 python中的物件可以理解為包括以下幾個要素 id 身份標識 type 資料型別 value 資料值 is和 的區別就是 is 比較的是資料的id值,也就意味著只要 a is b true 的話,a和b指向的是同乙個物件 比較的是資料的value值。2 塊與 塊的快...
JavaScript中小數的處理
我的方案是轉換為字串來進行處理,因為直接計算小數與任何數相乘 比如整數,小數 瀏覽器會計算不精確,出現一大段小數的問題 比如 img 具體方案課參考這段 計算小數點位置 function decimalplaces n else else if indexpoint 1 未採用科學計數法 並且有小數...
js中小數取整
以前我習慣性使用parseint做取整,後來發現乙個問題,對科學計數法不適用 js取整的方法 1.parseint parseint把小數轉化成整數是從要取整數據的左邊讀取,遇到非數字結束,保留前面已讀到的數字。當我們遇到科學計數法,使用parse取值可能是錯誤的 大部分來說是錯誤的 2.math ...